All Downloads are FREE. Search and download functionalities are using the official Maven repository.

mockit.internal.expectations.mocking.MockedBridge Maven / Gradle / Ivy

/*
 * Copyright (c) 2006 JMockit developers
 * This file is subject to the terms of the MIT license (see LICENSE.txt).
 */
package mockit.internal.expectations.mocking;

import static mockit.internal.expectations.RecordAndReplayExecution.RECORD_OR_REPLAY_LOCK;
import static mockit.internal.expectations.RecordAndReplayExecution.recordOrReplay;

import edu.umd.cs.findbugs.annotations.NonNull;
import edu.umd.cs.findbugs.annotations.Nullable;

import java.lang.reflect.Method;

import mockit.internal.ClassLoadingBridge;
import mockit.internal.expectations.ExecutionMode;
import mockit.internal.state.TestRun;
import mockit.internal.util.ObjectMethods;

public final class MockedBridge extends ClassLoadingBridge {
    @NonNull
    public static final ClassLoadingBridge 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 (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 = extractArguments(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;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy