diff --git a/src/main/java/org/mockito/internal/creation/bytebuddy/InlineByteBuddyMockMaker.java b/src/main/java/org/mockito/internal/creation/bytebuddy/InlineByteBuddyMockMaker.java index 1287219340..96477f4776 100644 --- a/src/main/java/org/mockito/internal/creation/bytebuddy/InlineByteBuddyMockMaker.java +++ b/src/main/java/org/mockito/internal/creation/bytebuddy/InlineByteBuddyMockMaker.java @@ -265,12 +265,18 @@ public InlineByteBuddyMockMaker() { } else if (type.isInstance(spy)) { return spy; } else { - // Unexpected construction of non-spied object - throw new MockitoException( - "Unexpected spy for " - + type.getName() - + " on instance of " - + object.getClass().getName()); + isSuspended.set(true); + try { + // Unexpected construction of non-spied object + throw new MockitoException( + "Unexpected spy for " + + type.getName() + + " on instance of " + + object.getClass().getName(), + object instanceof Throwable ? (Throwable) object : null); + } finally { + isSuspended.set(false); + } } } else if (currentConstruction.get() != type) { return null; diff --git a/src/main/java/org/mockito/internal/util/reflection/InstrumentationMemberAccessor.java b/src/main/java/org/mockito/internal/util/reflection/InstrumentationMemberAccessor.java index a8e1c26467..d1bfa4e809 100644 --- a/src/main/java/org/mockito/internal/util/reflection/InstrumentationMemberAccessor.java +++ b/src/main/java/org/mockito/internal/util/reflection/InstrumentationMemberAccessor.java @@ -95,6 +95,7 @@ class InstrumentationMemberAccessor implements MemberAccessor { INITIALIZATION_ERROR = throwable; } + @SuppressWarnings("unused") private final MethodHandle getModule, isOpen, redefineModule, privateLookupIn; InstrumentationMemberAccessor() { @@ -116,7 +117,7 @@ class InstrumentationMemberAccessor implements MemberAccessor { .findVirtual( module, "isOpen", - MethodType.methodType(boolean.class, String.class, module)); + MethodType.methodType(boolean.class, String.class)); redefineModule = MethodHandles.publicLookup() .findVirtual( @@ -330,9 +331,12 @@ public void set(Field field, Object target, Object value) throws IllegalAccessEx } private void assureOpen(Object module, String packageName) throws Throwable { - if (!(Boolean) - DISPATCHER.invokeWithArguments( - isOpen, module, packageName, DISPATCHER.getModule())) { + // It would be more reliable to check if a module's package already is opened to + // the dispatcher module from before. Unfortunately, there is no reliable check + // for doing so since the isOpen(String, Module) method always returns true + // if the second argument is an unnamed module. Therefore, for now, we need + // to reopen packages even if they are already opened to the dispatcher module. + if (!(Boolean) DISPATCHER.invokeWithArguments(isOpen, module, packageName)) { DISPATCHER.invokeWithArguments( redefineModule.bindTo(INSTRUMENTATION), module, diff --git a/subprojects/inline/inline.gradle b/subprojects/inline/inline.gradle index 22db17b067..1fc71c86b2 100644 --- a/subprojects/inline/inline.gradle +++ b/subprojects/inline/inline.gradle @@ -12,3 +12,7 @@ tasks.javadoc.enabled = false //required by the "StressTest.java" and "OneLinerStubStressTest.java" test.maxHeapSize = "256m" retryTest.maxHeapSize = "256m" + +test { + jvmArgs '--illegal-access=debug' +}