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

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

Go to download

JMockit is a Java toolkit for automated developer testing. It contains APIs for the creation of the objects to be tested, for mocking dependencies, and for faking external APIs; JUnit (4 & 5) and TestNG test runners are supported. It also contains an advanced code coverage tool.

There is a newer version: 1.49
Show newest version
/*
 * 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 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 (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 = 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 - 2024 Weber Informatics LLC | Privacy Policy