From 0852e08785630337247001e1a18a289dc8d527d3 Mon Sep 17 00:00:00 2001 From: Andriy Redko Date: Thu, 22 Dec 2022 19:47:40 -0500 Subject: [PATCH] Switch the default mockmaker to the inline mockmaker on JDK 17+. Fixes #2589 Signed-off-by: Andriy Redko --- .../configuration/plugins/DefaultMockitoPlugins.java | 7 +++++-- .../creation/bytebuddy/InlineBytecodeGenerator.java | 2 ++ .../configuration/plugins/DefaultMockitoPluginsTest.java | 4 ++-- .../configuration/ClassCacheVersusClassReloadingTest.java | 4 +++- .../mockito-extensions/org.mockito.plugins.MemberAccessor | 1 + .../org/mockito/moduletest/ReplicatingClassLoader.java | 5 +++++ .../mockito-extensions/org.mockito.plugins.MemberAccessor | 1 + 7 files changed, 19 insertions(+), 5 deletions(-) create mode 100644 subprojects/android/src/main/resources/mockito-extensions/org.mockito.plugins.MemberAccessor create mode 100644 subprojects/proxy/src/main/resources/mockito-extensions/org.mockito.plugins.MemberAccessor diff --git a/src/main/java/org/mockito/internal/configuration/plugins/DefaultMockitoPlugins.java b/src/main/java/org/mockito/internal/configuration/plugins/DefaultMockitoPlugins.java index 14f52f3705..780742c64a 100644 --- a/src/main/java/org/mockito/internal/configuration/plugins/DefaultMockitoPlugins.java +++ b/src/main/java/org/mockito/internal/configuration/plugins/DefaultMockitoPlugins.java @@ -28,13 +28,14 @@ public class DefaultMockitoPlugins implements MockitoPlugins { static final String SUBCLASS_ALIAS = MockMakers.SUBCLASS; public static final Set MOCK_MAKER_ALIASES = new HashSet<>(); static final String MODULE_ALIAS = "member-accessor-module"; + static final String REFLECTION_ALIAS = "member-accessor-reflection"; static { // Keep the mapping: plugin interface name -> plugin implementation class name DEFAULT_PLUGINS.put(PluginSwitch.class.getName(), DefaultPluginSwitch.class.getName()); DEFAULT_PLUGINS.put( MockMaker.class.getName(), - "org.mockito.internal.creation.bytebuddy.ByteBuddyMockMaker"); + "org.mockito.internal.creation.bytebuddy.InlineByteBuddyMockMaker"); DEFAULT_PLUGINS.put( StackTraceCleanerProvider.class.getName(), "org.mockito.internal.exceptions.stacktrace.DefaultStackTraceCleanerProvider"); @@ -53,9 +54,11 @@ public class DefaultMockitoPlugins implements MockitoPlugins { MockitoLogger.class.getName(), "org.mockito.internal.util.ConsoleMockitoLogger"); DEFAULT_PLUGINS.put( MemberAccessor.class.getName(), - "org.mockito.internal.util.reflection.ReflectionMemberAccessor"); + "org.mockito.internal.util.reflection.ModuleMemberAccessor"); DEFAULT_PLUGINS.put( MODULE_ALIAS, "org.mockito.internal.util.reflection.ModuleMemberAccessor"); + DEFAULT_PLUGINS.put( + REFLECTION_ALIAS, "org.mockito.internal.util.reflection.ReflectionMemberAccessor"); DEFAULT_PLUGINS.put( DoNotMockEnforcer.class.getName(), "org.mockito.internal.configuration.DefaultDoNotMockEnforcer"); diff --git a/src/main/java/org/mockito/internal/creation/bytebuddy/InlineBytecodeGenerator.java b/src/main/java/org/mockito/internal/creation/bytebuddy/InlineBytecodeGenerator.java index ed12d2ffe2..009daa4ccb 100644 --- a/src/main/java/org/mockito/internal/creation/bytebuddy/InlineBytecodeGenerator.java +++ b/src/main/java/org/mockito/internal/creation/bytebuddy/InlineBytecodeGenerator.java @@ -205,6 +205,7 @@ public Class mockClass(MockFeatures features) { boolean subclassingRequired = !features.interfaces.isEmpty() || features.serializableMode != SerializableMode.NONE + || features.stripAnnotations || Modifier.isAbstract(features.mockedType.getModifiers()); checkSupportedCombination(subclassingRequired, features); @@ -416,6 +417,7 @@ public synchronized void clearAllCaches() { } mocked.clear(); flatMocked.clear(); + subclassEngine.clearAllCaches(); try { instrumentation.retransformClasses(types.toArray(new Class[0])); } catch (UnmodifiableClassException e) { diff --git a/src/test/java/org/mockito/internal/configuration/plugins/DefaultMockitoPluginsTest.java b/src/test/java/org/mockito/internal/configuration/plugins/DefaultMockitoPluginsTest.java index aa1835696e..61fc8e8ed1 100644 --- a/src/test/java/org/mockito/internal/configuration/plugins/DefaultMockitoPluginsTest.java +++ b/src/test/java/org/mockito/internal/configuration/plugins/DefaultMockitoPluginsTest.java @@ -10,7 +10,6 @@ import static org.mockito.internal.configuration.plugins.DefaultMockitoPlugins.SUBCLASS_ALIAS; import org.junit.Test; -import org.mockito.internal.creation.bytebuddy.ByteBuddyMockMaker; import org.mockito.internal.creation.bytebuddy.InlineByteBuddyMockMaker; import org.mockito.internal.util.ConsoleMockitoLogger; import org.mockito.plugins.InstantiatorProvider2; @@ -35,7 +34,8 @@ public void provides_plugins() throws Exception { "org.mockito.internal.creation.bytebuddy.ByteBuddyMockMaker", DefaultMockitoPlugins.getDefaultPluginClass(SUBCLASS_ALIAS)); assertEquals( - ByteBuddyMockMaker.class, plugins.getDefaultPlugin(MockMaker.class).getClass()); + InlineByteBuddyMockMaker.class, + plugins.getDefaultPlugin(MockMaker.class).getClass()); assertNotNull(plugins.getDefaultPlugin(InstantiatorProvider2.class)); assertEquals( ConsoleMockitoLogger.class, diff --git a/src/test/java/org/mockitousage/configuration/ClassCacheVersusClassReloadingTest.java b/src/test/java/org/mockitousage/configuration/ClassCacheVersusClassReloadingTest.java index 7d9c95061f..6c08198864 100644 --- a/src/test/java/org/mockitousage/configuration/ClassCacheVersusClassReloadingTest.java +++ b/src/test/java/org/mockitousage/configuration/ClassCacheVersusClassReloadingTest.java @@ -74,7 +74,9 @@ private static SimplePerRealmReloadingClassLoader.ReloadClassPredicate reloadMoc return new SimplePerRealmReloadingClassLoader.ReloadClassPredicate() { public boolean acceptReloadOf(String qualifiedName) { return (!qualifiedName.contains("net.bytebuddy") - && qualifiedName.contains("org.mockito")); + && qualifiedName.contains("org.mockito") + && !qualifiedName.contains( + "org.mockito.internal.creation.bytebuddy.inject")); } }; } diff --git a/subprojects/android/src/main/resources/mockito-extensions/org.mockito.plugins.MemberAccessor b/subprojects/android/src/main/resources/mockito-extensions/org.mockito.plugins.MemberAccessor new file mode 100644 index 0000000000..71111e3378 --- /dev/null +++ b/subprojects/android/src/main/resources/mockito-extensions/org.mockito.plugins.MemberAccessor @@ -0,0 +1 @@ +member-accessor-reflection diff --git a/subprojects/module-test/src/test/java/org/mockito/moduletest/ReplicatingClassLoader.java b/subprojects/module-test/src/test/java/org/mockito/moduletest/ReplicatingClassLoader.java index c9cf0a32d2..144ff98767 100644 --- a/subprojects/module-test/src/test/java/org/mockito/moduletest/ReplicatingClassLoader.java +++ b/subprojects/module-test/src/test/java/org/mockito/moduletest/ReplicatingClassLoader.java @@ -53,4 +53,9 @@ public Class loadClass(String name) throws ClassNotFoundException { protected URL findResource(String moduleName, String name) { return Mockito.class.getResource("/" + name); } + + @Override + public InputStream getResourceAsStream(String name) { + return Mockito.class.getResourceAsStream("/" + name); + } } diff --git a/subprojects/proxy/src/main/resources/mockito-extensions/org.mockito.plugins.MemberAccessor b/subprojects/proxy/src/main/resources/mockito-extensions/org.mockito.plugins.MemberAccessor new file mode 100644 index 0000000000..71111e3378 --- /dev/null +++ b/subprojects/proxy/src/main/resources/mockito-extensions/org.mockito.plugins.MemberAccessor @@ -0,0 +1 @@ +member-accessor-reflection