/*
* Copyright (c) 2006 Rogério Liesenfeld
* This file is subject to the terms of the MIT license (see LICENSE.txt).
*/
package mockit.internal.expectations.mocking;
import java.lang.reflect.*;
import javax.annotation.*;
import mockit.internal.*;
import mockit.internal.expectations.*;
import mockit.internal.state.*;
import mockit.internal.util.*;
import static mockit.internal.expectations.RecordAndReplayExecution.*;
import static mockit.internal.util.Utilities.calledFromSpecialThread;
public final class MockedBridge extends MockingBridge
{
@Nonnull public static final MockingBridge MB = new MockedBridge();
private MockedBridge() { super("$MB"); }
@Nullable @Override
public Object invoke(@Nullable Object mocked, Method method, @Nonnull Object[] args) throws Throwable
{
String mockedClassDesc = (String) args[1];
if (calledFromSpecialThread() || notToBeMocked(mocked, mockedClassDesc)) {
return Void.class;
}
String mockName = (String) args[2];
String mockDesc = (String) args[3];
String mockNameAndDesc = mockName + mockDesc;
Integer executionMode = (Integer) args[5];
Object[] mockArgs = extractMockArguments(6, args);
boolean regularExecutionWithRecordReplayLock =
executionMode == ExecutionMode.Regular.ordinal() && RECORD_OR_REPLAY_LOCK.isHeldByCurrentThread();
Object rv;
if (regularExecutionWithRecordReplayLock && mocked != null) {
rv = ObjectMethods.evaluateOverride(mocked, mockNameAndDesc, args);
if (rv != null) {
return rv;
}
}
if (
TestRun.getExecutingTest().isProceedingIntoRealImplementation() ||
regularExecutionWithRecordReplayLock ||
TestRun.isInsideNoMockingZone()
) {
return Void.class;
}
TestRun.enterNoMockingZone();
try {
int mockAccess = (Integer) args[0];
String genericSignature = (String) args[4];
rv = recordOrReplay(
mocked, mockAccess, mockedClassDesc, mockNameAndDesc, genericSignature, executionMode, mockArgs);
}
finally {
TestRun.exitNoMockingZone();
}
return rv;
}
}