From ab12d97dd60bef90117a45c3d1d0948ee55ffc56 Mon Sep 17 00:00:00 2001 From: Ivo Smid Date: Sun, 15 Jul 2018 13:56:37 +0200 Subject: [PATCH] Allow mockito-logger configurable as Mockito extension --- gradle/dependencies.gradle | 2 +- .../plugins/DefaultMockitoPlugins.java | 2 + .../configuration/plugins/PluginRegistry.java | 16 ++++++- .../configuration/plugins/Plugins.java | 11 +++++ .../framework/DefaultMockitoSession.java | 2 +- .../org/mockito/internal/junit/JUnitRule.java | 2 +- .../junit/MismatchReportingTestListener.java | 2 +- .../internal/junit/StubbingArgMismatches.java | 2 +- .../internal/junit/UniversalTestListener.java | 2 +- .../internal/junit/UnusedStubbings.java | 2 +- .../internal/runners/RunnerFactory.java | 4 +- .../session/DefaultMockitoSessionBuilder.java | 6 +-- .../session/MockitoLoggerAdapter.java | 2 +- .../session/MockitoSessionLoggerAdapter.java | 2 +- .../internal/util/ConsoleMockitoLogger.java | 2 + .../java/org/mockito/junit/MockitoJUnit.java | 4 +- .../util => plugins}/MockitoLogger.java | 2 +- .../ConsoleSpammingMockitoJUnitRunner.java | 6 +-- .../plugins/DefaultMockitoPluginsTest.java | 3 ++ .../internal/util/SimpleMockitoLogger.java | 2 + .../junitrule/LenientJUnitRuleTest.java | 2 +- .../plugins/MockitoPluginsTest.java | 2 + .../creation/AndroidByteBuddyMockMaker.java | 4 +- subprojects/extTest/extTest.gradle | 2 + .../plugins/logger/MockitoLoggerTest.java | 48 +++++++++++++++++++ .../plugins/logger/MyMockitoLogger.java | 40 ++++++++++++++++ .../plugins/switcher/PluginSwitchTest.java | 6 ++- .../org.mockito.plugins.MockitoLogger | 1 + .../junit/jupiter/MockitoExtension.java | 8 ++-- 29 files changed, 161 insertions(+), 28 deletions(-) rename src/main/java/org/mockito/{internal/util => plugins}/MockitoLogger.java (84%) create mode 100644 subprojects/extTest/src/test/java/org/mockitousage/plugins/logger/MockitoLoggerTest.java create mode 100644 subprojects/extTest/src/test/java/org/mockitousage/plugins/logger/MyMockitoLogger.java create mode 100644 subprojects/extTest/src/test/resources/mockito-extensions/org.mockito.plugins.MockitoLogger diff --git a/gradle/dependencies.gradle b/gradle/dependencies.gradle index 7f64f84d2c..1a2c80c21f 100644 --- a/gradle/dependencies.gradle +++ b/gradle/dependencies.gradle @@ -11,7 +11,7 @@ libraries.junit4 = 'junit:junit:4.12' libraries.junitJupiterApi = "org.junit.jupiter:junit-jupiter-api:${versions.junitJupiter}" libraries.junitPlatformLauncher = 'org.junit.platform:junit-platform-launcher:1.1.0' libraries.junitJupiterEngine = "org.junit.jupiter:junit-jupiter-engine:${versions.junitJupiter}" -libraries.assertj = 'org.assertj:assertj-core:2.9.0' +libraries.assertj = 'org.assertj:assertj-core:3.10.0' libraries.hamcrest = 'org.hamcrest:hamcrest-core:1.3' libraries.testng = 'org.testng:testng:6.3.1' 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 f80e7c4f4b..e5aefd958b 100644 --- a/src/main/java/org/mockito/internal/configuration/plugins/DefaultMockitoPlugins.java +++ b/src/main/java/org/mockito/internal/configuration/plugins/DefaultMockitoPlugins.java @@ -9,6 +9,7 @@ import org.mockito.plugins.InstantiatorProvider; import org.mockito.plugins.InstantiatorProvider2; import org.mockito.plugins.MockMaker; +import org.mockito.plugins.MockitoLogger; import org.mockito.plugins.MockitoPlugins; import org.mockito.plugins.PluginSwitch; import org.mockito.plugins.StackTraceCleanerProvider; @@ -29,6 +30,7 @@ class DefaultMockitoPlugins implements MockitoPlugins { DEFAULT_PLUGINS.put(InstantiatorProvider2.class.getName(), "org.mockito.internal.creation.instance.DefaultInstantiatorProvider"); DEFAULT_PLUGINS.put(AnnotationEngine.class.getName(), "org.mockito.internal.configuration.InjectingAnnotationEngine"); DEFAULT_PLUGINS.put(INLINE_ALIAS, "org.mockito.internal.creation.bytebuddy.InlineByteBuddyMockMaker"); + DEFAULT_PLUGINS.put(MockitoLogger.class.getName(), "org.mockito.internal.util.ConsoleMockitoLogger"); } @Override diff --git a/src/main/java/org/mockito/internal/configuration/plugins/PluginRegistry.java b/src/main/java/org/mockito/internal/configuration/plugins/PluginRegistry.java index 02e5d66d4a..2e5f069e62 100644 --- a/src/main/java/org/mockito/internal/configuration/plugins/PluginRegistry.java +++ b/src/main/java/org/mockito/internal/configuration/plugins/PluginRegistry.java @@ -9,6 +9,7 @@ import org.mockito.plugins.InstantiatorProvider; import org.mockito.plugins.InstantiatorProvider2; import org.mockito.plugins.MockMaker; +import org.mockito.plugins.MockitoLogger; import org.mockito.plugins.PluginSwitch; import org.mockito.plugins.StackTraceCleanerProvider; @@ -25,9 +26,12 @@ class PluginRegistry { private final InstantiatorProvider2 instantiatorProvider; - private AnnotationEngine annotationEngine = new PluginLoader(pluginSwitch) + private final AnnotationEngine annotationEngine = new PluginLoader(pluginSwitch) .loadPlugin(AnnotationEngine.class); + private final MockitoLogger mockitoLogger = new PluginLoader(pluginSwitch) + .loadPlugin(MockitoLogger.class); + PluginRegistry() { Object impl = new PluginLoader(pluginSwitch).loadPlugin(InstantiatorProvider2.class, InstantiatorProvider.class); if (impl instanceof InstantiatorProvider) { @@ -75,4 +79,14 @@ InstantiatorProvider2 getInstantiatorProvider() { AnnotationEngine getAnnotationEngine() { return annotationEngine; } + + /** + * Returns the logger available for the current runtime. + * + *

Returns {@link org.mockito.internal.util.ConsoleMockitoLogger} if no + * {@link org.mockito.plugins.MockitoLogger} extension exists or is visible in the current classpath.

+ */ + MockitoLogger getMockitoLogger() { + return mockitoLogger; + } } diff --git a/src/main/java/org/mockito/internal/configuration/plugins/Plugins.java b/src/main/java/org/mockito/internal/configuration/plugins/Plugins.java index f65fe89ea9..84e3c0d294 100644 --- a/src/main/java/org/mockito/internal/configuration/plugins/Plugins.java +++ b/src/main/java/org/mockito/internal/configuration/plugins/Plugins.java @@ -4,6 +4,7 @@ */ package org.mockito.internal.configuration.plugins; +import org.mockito.plugins.MockitoLogger; import org.mockito.plugins.AnnotationEngine; import org.mockito.plugins.InstantiatorProvider2; import org.mockito.plugins.MockMaker; @@ -55,6 +56,16 @@ public static AnnotationEngine getAnnotationEngine() { return registry.getAnnotationEngine(); } + /** + * Returns the logger available for the current runtime. + * + *

Returns {@link org.mockito.internal.util.ConsoleMockitoLogger} if no + * {@link org.mockito.plugins.MockitoLogger} extension exists or is visible in the current classpath.

+ */ + public static MockitoLogger getMockitoLogger() { + return registry.getMockitoLogger(); + } + /** * @return instance of mockito plugins type */ diff --git a/src/main/java/org/mockito/internal/framework/DefaultMockitoSession.java b/src/main/java/org/mockito/internal/framework/DefaultMockitoSession.java index c900bf7c12..98d871ddde 100644 --- a/src/main/java/org/mockito/internal/framework/DefaultMockitoSession.java +++ b/src/main/java/org/mockito/internal/framework/DefaultMockitoSession.java @@ -11,7 +11,7 @@ import org.mockito.internal.exceptions.Reporter; import org.mockito.internal.junit.TestFinishedEvent; import org.mockito.internal.junit.UniversalTestListener; -import org.mockito.internal.util.MockitoLogger; +import org.mockito.plugins.MockitoLogger; import org.mockito.quality.Strictness; import java.util.List; diff --git a/src/main/java/org/mockito/internal/junit/JUnitRule.java b/src/main/java/org/mockito/internal/junit/JUnitRule.java index b8254160cb..ba00c343ae 100644 --- a/src/main/java/org/mockito/internal/junit/JUnitRule.java +++ b/src/main/java/org/mockito/internal/junit/JUnitRule.java @@ -9,7 +9,7 @@ import org.mockito.Mockito; import org.mockito.MockitoSession; import org.mockito.internal.session.MockitoSessionLoggerAdapter; -import org.mockito.internal.util.MockitoLogger; +import org.mockito.plugins.MockitoLogger; import org.mockito.quality.Strictness; import org.mockito.junit.MockitoRule; diff --git a/src/main/java/org/mockito/internal/junit/MismatchReportingTestListener.java b/src/main/java/org/mockito/internal/junit/MismatchReportingTestListener.java index 26d4e4e6d2..d7053962b2 100644 --- a/src/main/java/org/mockito/internal/junit/MismatchReportingTestListener.java +++ b/src/main/java/org/mockito/internal/junit/MismatchReportingTestListener.java @@ -4,7 +4,7 @@ */ package org.mockito.internal.junit; -import org.mockito.internal.util.MockitoLogger; +import org.mockito.plugins.MockitoLogger; import org.mockito.mock.MockCreationSettings; import java.util.Collection; diff --git a/src/main/java/org/mockito/internal/junit/StubbingArgMismatches.java b/src/main/java/org/mockito/internal/junit/StubbingArgMismatches.java index 3d6342c752..f125f60964 100644 --- a/src/main/java/org/mockito/internal/junit/StubbingArgMismatches.java +++ b/src/main/java/org/mockito/internal/junit/StubbingArgMismatches.java @@ -4,7 +4,7 @@ */ package org.mockito.internal.junit; -import org.mockito.internal.util.MockitoLogger; +import org.mockito.plugins.MockitoLogger; import org.mockito.invocation.Invocation; import java.util.LinkedHashMap; diff --git a/src/main/java/org/mockito/internal/junit/UniversalTestListener.java b/src/main/java/org/mockito/internal/junit/UniversalTestListener.java index 66c9dee051..2b4e4daec6 100644 --- a/src/main/java/org/mockito/internal/junit/UniversalTestListener.java +++ b/src/main/java/org/mockito/internal/junit/UniversalTestListener.java @@ -5,7 +5,7 @@ package org.mockito.internal.junit; import org.mockito.internal.creation.settings.CreationSettings; -import org.mockito.internal.util.MockitoLogger; +import org.mockito.plugins.MockitoLogger; import org.mockito.mock.MockCreationSettings; import org.mockito.quality.Strictness; diff --git a/src/main/java/org/mockito/internal/junit/UnusedStubbings.java b/src/main/java/org/mockito/internal/junit/UnusedStubbings.java index 5b6434d840..657a6810a7 100644 --- a/src/main/java/org/mockito/internal/junit/UnusedStubbings.java +++ b/src/main/java/org/mockito/internal/junit/UnusedStubbings.java @@ -5,7 +5,7 @@ package org.mockito.internal.junit; import org.mockito.internal.exceptions.Reporter; -import org.mockito.internal.util.MockitoLogger; +import org.mockito.plugins.MockitoLogger; import org.mockito.internal.util.collections.ListUtil; import org.mockito.invocation.Invocation; import org.mockito.stubbing.Stubbing; diff --git a/src/main/java/org/mockito/internal/runners/RunnerFactory.java b/src/main/java/org/mockito/internal/runners/RunnerFactory.java index 61456dc640..efdb6b2988 100644 --- a/src/main/java/org/mockito/internal/runners/RunnerFactory.java +++ b/src/main/java/org/mockito/internal/runners/RunnerFactory.java @@ -5,12 +5,12 @@ package org.mockito.internal.runners; import org.mockito.exceptions.base.MockitoException; +import org.mockito.internal.configuration.plugins.Plugins; import org.mockito.internal.junit.MismatchReportingTestListener; import org.mockito.internal.junit.MockitoTestListener; import org.mockito.internal.junit.NoOpTestListener; import org.mockito.internal.junit.StrictStubsRunnerTestListener; import org.mockito.internal.runners.util.RunnerProvider; -import org.mockito.internal.util.ConsoleMockitoLogger; import org.mockito.internal.util.Supplier; import java.lang.reflect.InvocationTargetException; @@ -39,7 +39,7 @@ public MockitoTestListener get() { public InternalRunner createStrict(Class klass) throws InvocationTargetException { return create(klass, new Supplier() { public MockitoTestListener get() { - return new MismatchReportingTestListener(new ConsoleMockitoLogger()); + return new MismatchReportingTestListener(Plugins.getMockitoLogger()); } }); } diff --git a/src/main/java/org/mockito/internal/session/DefaultMockitoSessionBuilder.java b/src/main/java/org/mockito/internal/session/DefaultMockitoSessionBuilder.java index d9b21e580a..f47ee15972 100644 --- a/src/main/java/org/mockito/internal/session/DefaultMockitoSessionBuilder.java +++ b/src/main/java/org/mockito/internal/session/DefaultMockitoSessionBuilder.java @@ -5,9 +5,9 @@ package org.mockito.internal.session; import org.mockito.MockitoSession; +import org.mockito.internal.configuration.plugins.Plugins; import org.mockito.internal.framework.DefaultMockitoSession; -import org.mockito.internal.util.ConsoleMockitoLogger; -import org.mockito.internal.util.MockitoLogger; +import org.mockito.plugins.MockitoLogger; import org.mockito.quality.Strictness; import org.mockito.session.MockitoSessionBuilder; import org.mockito.session.MockitoSessionLogger; @@ -74,7 +74,7 @@ public MockitoSession startMocking() { effectiveName = this.name == null ? lastTestClassInstance.getClass().getName() : this.name; } Strictness effectiveStrictness = this.strictness == null ? Strictness.STRICT_STUBS : this.strictness; - MockitoLogger logger = this.logger == null ? new ConsoleMockitoLogger() : new MockitoLoggerAdapter(this.logger); + MockitoLogger logger = this.logger == null ? Plugins.getMockitoLogger() : new MockitoLoggerAdapter(this.logger); return new DefaultMockitoSession(effectiveTestClassInstances, effectiveName, effectiveStrictness, logger); } } diff --git a/src/main/java/org/mockito/internal/session/MockitoLoggerAdapter.java b/src/main/java/org/mockito/internal/session/MockitoLoggerAdapter.java index b7329e781e..2197317987 100644 --- a/src/main/java/org/mockito/internal/session/MockitoLoggerAdapter.java +++ b/src/main/java/org/mockito/internal/session/MockitoLoggerAdapter.java @@ -4,7 +4,7 @@ */ package org.mockito.internal.session; -import org.mockito.internal.util.MockitoLogger; +import org.mockito.plugins.MockitoLogger; import org.mockito.session.MockitoSessionLogger; class MockitoLoggerAdapter implements MockitoLogger { diff --git a/src/main/java/org/mockito/internal/session/MockitoSessionLoggerAdapter.java b/src/main/java/org/mockito/internal/session/MockitoSessionLoggerAdapter.java index 2e8634bac5..f4770c5656 100644 --- a/src/main/java/org/mockito/internal/session/MockitoSessionLoggerAdapter.java +++ b/src/main/java/org/mockito/internal/session/MockitoSessionLoggerAdapter.java @@ -4,7 +4,7 @@ */ package org.mockito.internal.session; -import org.mockito.internal.util.MockitoLogger; +import org.mockito.plugins.MockitoLogger; import org.mockito.session.MockitoSessionLogger; public class MockitoSessionLoggerAdapter implements MockitoSessionLogger { diff --git a/src/main/java/org/mockito/internal/util/ConsoleMockitoLogger.java b/src/main/java/org/mockito/internal/util/ConsoleMockitoLogger.java index d8df8eb31f..3eb89396e1 100644 --- a/src/main/java/org/mockito/internal/util/ConsoleMockitoLogger.java +++ b/src/main/java/org/mockito/internal/util/ConsoleMockitoLogger.java @@ -4,6 +4,8 @@ */ package org.mockito.internal.util; +import org.mockito.plugins.MockitoLogger; + public class ConsoleMockitoLogger implements MockitoLogger { /* (non-Javadoc) diff --git a/src/main/java/org/mockito/junit/MockitoJUnit.java b/src/main/java/org/mockito/junit/MockitoJUnit.java index 2f8b65f3bf..28765fc22f 100644 --- a/src/main/java/org/mockito/junit/MockitoJUnit.java +++ b/src/main/java/org/mockito/junit/MockitoJUnit.java @@ -5,10 +5,10 @@ package org.mockito.junit; import org.mockito.Incubating; +import org.mockito.internal.configuration.plugins.Plugins; import org.mockito.quality.Strictness; import org.mockito.internal.junit.JUnitRule; import org.mockito.internal.junit.VerificationCollectorImpl; -import org.mockito.internal.util.ConsoleMockitoLogger; /** * The JUnit rule can be used instead of {@link MockitoJUnitRunner}. See {@link MockitoRule}. @@ -25,7 +25,7 @@ public class MockitoJUnit { * @since 1.10.17 */ public static MockitoRule rule() { - return new JUnitRule(new ConsoleMockitoLogger(), Strictness.WARN); + return new JUnitRule(Plugins.getMockitoLogger(), Strictness.WARN); } /** diff --git a/src/main/java/org/mockito/internal/util/MockitoLogger.java b/src/main/java/org/mockito/plugins/MockitoLogger.java similarity index 84% rename from src/main/java/org/mockito/internal/util/MockitoLogger.java rename to src/main/java/org/mockito/plugins/MockitoLogger.java index af66ceee7c..1040904857 100644 --- a/src/main/java/org/mockito/internal/util/MockitoLogger.java +++ b/src/main/java/org/mockito/plugins/MockitoLogger.java @@ -2,7 +2,7 @@ * Copyright (c) 2007 Mockito contributors * This program is made available under the terms of the MIT License. */ -package org.mockito.internal.util; +package org.mockito.plugins; public interface MockitoLogger { diff --git a/src/main/java/org/mockito/runners/ConsoleSpammingMockitoJUnitRunner.java b/src/main/java/org/mockito/runners/ConsoleSpammingMockitoJUnitRunner.java index 522b795ab8..b03b0980fc 100644 --- a/src/main/java/org/mockito/runners/ConsoleSpammingMockitoJUnitRunner.java +++ b/src/main/java/org/mockito/runners/ConsoleSpammingMockitoJUnitRunner.java @@ -12,11 +12,11 @@ import org.junit.runner.notification.Failure; import org.junit.runner.notification.RunListener; import org.junit.runner.notification.RunNotifier; +import org.mockito.internal.configuration.plugins.Plugins; import org.mockito.internal.debugging.WarningsCollector; import org.mockito.internal.runners.RunnerFactory; import org.mockito.internal.runners.InternalRunner; -import org.mockito.internal.util.ConsoleMockitoLogger; -import org.mockito.internal.util.MockitoLogger; +import org.mockito.plugins.MockitoLogger; import java.lang.reflect.InvocationTargetException; @@ -33,7 +33,7 @@ public class ConsoleSpammingMockitoJUnitRunner extends Runner implements Filtera private final InternalRunner runner; public ConsoleSpammingMockitoJUnitRunner(Class klass) throws InvocationTargetException { - this(new ConsoleMockitoLogger(), new RunnerFactory().create(klass)); + this(Plugins.getMockitoLogger(), new RunnerFactory().create(klass)); } ConsoleSpammingMockitoJUnitRunner(MockitoLogger logger, InternalRunner runner) { 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 5935eaed93..d13f729b42 100644 --- a/src/test/java/org/mockito/internal/configuration/plugins/DefaultMockitoPluginsTest.java +++ b/src/test/java/org/mockito/internal/configuration/plugins/DefaultMockitoPluginsTest.java @@ -7,9 +7,11 @@ 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.InstantiatorProvider; import org.mockito.plugins.InstantiatorProvider2; import org.mockito.plugins.MockMaker; +import org.mockito.plugins.MockitoLogger; import org.mockitoutil.TestBase; import static org.junit.Assert.*; @@ -27,5 +29,6 @@ public void provides_plugins() throws Exception { assertEquals(ByteBuddyMockMaker.class, plugins.getDefaultPlugin(MockMaker.class).getClass()); assertNotNull(plugins.getDefaultPlugin(InstantiatorProvider.class)); assertNotNull(plugins.getDefaultPlugin(InstantiatorProvider2.class)); + assertEquals(ConsoleMockitoLogger.class, plugins.getDefaultPlugin(MockitoLogger.class).getClass()); } } diff --git a/src/test/java/org/mockito/internal/util/SimpleMockitoLogger.java b/src/test/java/org/mockito/internal/util/SimpleMockitoLogger.java index 129547f1c9..2d6edae6fe 100644 --- a/src/test/java/org/mockito/internal/util/SimpleMockitoLogger.java +++ b/src/test/java/org/mockito/internal/util/SimpleMockitoLogger.java @@ -4,6 +4,8 @@ */ package org.mockito.internal.util; +import org.mockito.plugins.MockitoLogger; + public class SimpleMockitoLogger implements MockitoLogger { private StringBuilder loggedInfo = new StringBuilder(); diff --git a/src/test/java/org/mockitousage/junitrule/LenientJUnitRuleTest.java b/src/test/java/org/mockitousage/junitrule/LenientJUnitRuleTest.java index 2e131710d0..9921176492 100644 --- a/src/test/java/org/mockitousage/junitrule/LenientJUnitRuleTest.java +++ b/src/test/java/org/mockitousage/junitrule/LenientJUnitRuleTest.java @@ -9,7 +9,7 @@ import org.mockito.Mock; import org.mockito.quality.Strictness; import org.mockito.internal.junit.JUnitRule; -import org.mockito.internal.util.MockitoLogger; +import org.mockito.plugins.MockitoLogger; import org.mockito.junit.MockitoRule; import org.mockitousage.IMethods; diff --git a/src/test/java/org/mockitousage/plugins/MockitoPluginsTest.java b/src/test/java/org/mockitousage/plugins/MockitoPluginsTest.java index a1a3500bfa..9485d1ca3f 100644 --- a/src/test/java/org/mockitousage/plugins/MockitoPluginsTest.java +++ b/src/test/java/org/mockitousage/plugins/MockitoPluginsTest.java @@ -11,6 +11,7 @@ import org.mockito.plugins.InstantiatorProvider; import org.mockito.plugins.InstantiatorProvider2; import org.mockito.plugins.MockMaker; +import org.mockito.plugins.MockitoLogger; import org.mockito.plugins.MockitoPlugins; import org.mockito.plugins.PluginSwitch; import org.mockito.plugins.StackTraceCleanerProvider; @@ -32,6 +33,7 @@ public void provides_built_in_plugins() { assertNotNull(plugins.getDefaultPlugin(InstantiatorProvider.class)); assertNotNull(plugins.getDefaultPlugin(InstantiatorProvider2.class)); assertNotNull(plugins.getDefaultPlugin(AnnotationEngine.class)); + assertNotNull(plugins.getDefaultPlugin(MockitoLogger.class)); } @SuppressWarnings("deprecation") diff --git a/subprojects/android/src/main/java/org/mockito/android/internal/creation/AndroidByteBuddyMockMaker.java b/subprojects/android/src/main/java/org/mockito/android/internal/creation/AndroidByteBuddyMockMaker.java index 56ffcec0bb..db77fb7b03 100644 --- a/subprojects/android/src/main/java/org/mockito/android/internal/creation/AndroidByteBuddyMockMaker.java +++ b/subprojects/android/src/main/java/org/mockito/android/internal/creation/AndroidByteBuddyMockMaker.java @@ -4,8 +4,8 @@ */ package org.mockito.android.internal.creation; +import org.mockito.internal.configuration.plugins.Plugins; import org.mockito.internal.creation.bytebuddy.SubclassByteBuddyMockMaker; -import org.mockito.internal.util.ConsoleMockitoLogger; import org.mockito.internal.util.Platform; import org.mockito.invocation.MockHandler; import org.mockito.mock.MockCreationSettings; @@ -21,7 +21,7 @@ public AndroidByteBuddyMockMaker() { if (Platform.isAndroid() || Platform.isAndroidMockMakerRequired()) { delegate = new SubclassByteBuddyMockMaker(new AndroidLoadingStrategy()); } else { - new ConsoleMockitoLogger().log(join( + Plugins.getMockitoLogger().log(join( "IMPORTANT NOTE FROM MOCKITO:", "", "You included the 'mockito-android' dependency in a non-Android environment.", diff --git a/subprojects/extTest/extTest.gradle b/subprojects/extTest/extTest.gradle index 640fe48088..34fd969e77 100644 --- a/subprojects/extTest/extTest.gradle +++ b/subprojects/extTest/extTest.gradle @@ -17,9 +17,11 @@ repositories { dependencies { testCompile "org.mockito:mockito-core:$version" + testCompile project(":junit-jupiter") testCompile project(path: ':', configuration: 'testUtil') testCompile libraries.junit4 testCompile libraries.assertj + testCompile libraries.junitJupiterApi } configurations.all { diff --git a/subprojects/extTest/src/test/java/org/mockitousage/plugins/logger/MockitoLoggerTest.java b/subprojects/extTest/src/test/java/org/mockitousage/plugins/logger/MockitoLoggerTest.java new file mode 100644 index 0000000000..c8a484db0c --- /dev/null +++ b/subprojects/extTest/src/test/java/org/mockitousage/plugins/logger/MockitoLoggerTest.java @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2018 Mockito contributors + * This program is made available under the terms of the MIT License. + */ +package org.mockitousage.plugins.logger; + +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.junit.jupiter.MockitoSettings; +import org.mockito.quality.Strictness; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +@MockitoSettings(strictness = Strictness.WARN) +@ExtendWith(MockitoExtension.class) +class MockitoLoggerTest { + @BeforeAll + static void setUp() { + MyMockitoLogger.enable(); + } + + @Test + void stricktness_warn_logged_into_custom_logger() { + when(mock(Foo.class).doIt()).thenReturn(123); + } + + @AfterAll + static void tearDown() { + assertThat(MyMockitoLogger.getLoggetItems()) + .hasOnlyOneElementSatisfying(item -> + assertThat(item) + .asString() + .contains("[MockitoHint]") + .contains("org.mockitousage.plugins.logger.MockitoLoggerTest") + .contains("Unused")); + + MyMockitoLogger.clear(); + } + + interface Foo { + int doIt(); + } +} diff --git a/subprojects/extTest/src/test/java/org/mockitousage/plugins/logger/MyMockitoLogger.java b/subprojects/extTest/src/test/java/org/mockitousage/plugins/logger/MyMockitoLogger.java new file mode 100644 index 0000000000..b789caefe2 --- /dev/null +++ b/subprojects/extTest/src/test/java/org/mockitousage/plugins/logger/MyMockitoLogger.java @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2018 Mockito contributors + * This program is made available under the terms of the MIT License. + */ +package org.mockitousage.plugins.logger; + +import java.util.ArrayList; +import java.util.List; + +import org.mockito.internal.util.ConsoleMockitoLogger; +import org.mockito.plugins.MockitoLogger; + +public class MyMockitoLogger implements MockitoLogger { + private static final ThreadLocal enabled = ThreadLocal.withInitial(() -> false); + private static final ThreadLocal> loggedItems = ThreadLocal.withInitial(ArrayList::new); + + private final MockitoLogger defaultLogger = new ConsoleMockitoLogger(); + + @Override + public void log(Object what) { + if (enabled.get()) { + loggedItems.get().add(what); + } else { + defaultLogger.log(what); + } + } + + static void enable() { + enabled.set(true); + } + + static List getLoggetItems() { + return loggedItems.get(); + } + + static void clear() { + enabled.remove(); + loggedItems.remove(); + } +} diff --git a/subprojects/extTest/src/test/java/org/mockitousage/plugins/switcher/PluginSwitchTest.java b/subprojects/extTest/src/test/java/org/mockitousage/plugins/switcher/PluginSwitchTest.java index dabf4ce92e..270d084589 100644 --- a/subprojects/extTest/src/test/java/org/mockitousage/plugins/switcher/PluginSwitchTest.java +++ b/subprojects/extTest/src/test/java/org/mockitousage/plugins/switcher/PluginSwitchTest.java @@ -7,6 +7,7 @@ import org.junit.Test; import org.mockitousage.plugins.instantiator.MyInstantiatorProvider2; +import org.mockitousage.plugins.logger.MyMockitoLogger; import org.mockitousage.plugins.stacktrace.MyStackTraceCleanerProvider; import java.util.List; @@ -22,7 +23,10 @@ public class PluginSwitchTest { @Test public void plugin_switcher_is_used() { mock(List.class); - assertEquals(MyPluginSwitch.invokedFor, asList(MyMockMaker.class.getName(), MyStackTraceCleanerProvider.class.getName(), MyInstantiatorProvider2.class.getName())); + assertEquals(MyPluginSwitch.invokedFor, asList(MyMockMaker.class.getName(), + MyStackTraceCleanerProvider.class.getName(), + MyMockitoLogger.class.getName(), + MyInstantiatorProvider2.class.getName())); } @Test diff --git a/subprojects/extTest/src/test/resources/mockito-extensions/org.mockito.plugins.MockitoLogger b/subprojects/extTest/src/test/resources/mockito-extensions/org.mockito.plugins.MockitoLogger new file mode 100644 index 0000000000..f072f554b4 --- /dev/null +++ b/subprojects/extTest/src/test/resources/mockito-extensions/org.mockito.plugins.MockitoLogger @@ -0,0 +1 @@ +org.mockitousage.plugins.logger.MyMockitoLogger diff --git a/subprojects/junit-jupiter/src/main/java/org/mockito/junit/jupiter/MockitoExtension.java b/subprojects/junit-jupiter/src/main/java/org/mockito/junit/jupiter/MockitoExtension.java index ad1d434d3d..64f0509289 100644 --- a/subprojects/junit-jupiter/src/main/java/org/mockito/junit/jupiter/MockitoExtension.java +++ b/subprojects/junit-jupiter/src/main/java/org/mockito/junit/jupiter/MockitoExtension.java @@ -4,7 +4,6 @@ */ package org.mockito.junit.jupiter; - import java.util.LinkedHashSet; import java.util.Optional; import java.util.Set; @@ -15,6 +14,8 @@ import org.junit.jupiter.api.extension.TestInstancePostProcessor; import org.mockito.Mockito; import org.mockito.MockitoSession; +import org.mockito.internal.configuration.plugins.Plugins; +import org.mockito.internal.session.MockitoSessionLoggerAdapter; import org.mockito.junit.MockitoJUnitRunner; import org.mockito.quality.Strictness; @@ -57,7 +58,7 @@ * } * */ -public class MockitoExtension implements TestInstancePostProcessor,BeforeEachCallback, AfterEachCallback { +public class MockitoExtension implements TestInstancePostProcessor, BeforeEachCallback, AfterEachCallback { private final static Namespace MOCKITO = create("org.mockito"); @@ -89,7 +90,7 @@ private MockitoExtension(Strictness strictness) { * @param context the current extension context; never {@code null} */ @Override - public void postProcessTestInstance(Object testInstance, ExtensionContext context){ + public void postProcessTestInstance(Object testInstance, ExtensionContext context) { context.getStore(MOCKITO).put(TEST_INSTANCE, testInstance); } @@ -112,6 +113,7 @@ public void beforeEach(final ExtensionContext context) { MockitoSession session = Mockito.mockitoSession() .initMocks(testInstances.toArray()) .strictness(actualStrictness) + .logger(new MockitoSessionLoggerAdapter(Plugins.getMockitoLogger())) .startMocking(); context.getStore(MOCKITO).put(SESSION, session);