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 a472f55c10..6483a1cb0d 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 f670c64bc0..d681823225 100644 --- a/src/main/java/org/mockito/internal/junit/UniversalTestListener.java +++ b/src/main/java/org/mockito/internal/junit/UniversalTestListener.java @@ -6,7 +6,7 @@ import org.mockito.internal.creation.settings.CreationSettings; import org.mockito.internal.listeners.AutoCleanableListener; -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 3505d2cb1c..d45b13dc6f 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.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 SupplierBy default logs to console
+ * + *All mockito logging goes through this class and could be customized as usual Mockito plugin.
+ * + *Suppose you wrote an extension to customize logging, in order to tell Mockito to use it you need to put + * in your classpath: + *
org.awesome.mockito.AwesomeLogger
that
+ * extends the MockitoLogger
.
+ * mockito-extensions/org.mockito.plugins.MockitoLogger
". The content of this file is
+ * exactly a one line with the qualified name:
+ * org.awesome.mockito.AwesomeLogger
.
+ * Note that if several mockito-extensions/org.mockito.plugins.MockitoLogger
files exists in the
+ * classpath Mockito will only use the first returned by the standard {@link ClassLoader#getResource} mechanism.
+ *
+ * @since 2.23.19
+ */
+@Incubating
+public interface MockitoLogger {
+ /**
+ * Log specified object.
+ *
+ * @param what to be logged
+ */
+ @Incubating
+ void log(Object what);
+}
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 ee204ebc6c..aa07054a61 100644
--- a/subprojects/extTest/extTest.gradle
+++ b/subprojects/extTest/extTest.gradle
@@ -11,9 +11,11 @@ repositories {
dependencies {
testCompile project.rootProject
+ 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..c1cce51221
--- /dev/null
+++ b/subprojects/extTest/src/test/java/org/mockitousage/plugins/logger/MockitoLoggerTest.java
@@ -0,0 +1,50 @@
+/*
+ * 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.List;
+
+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 strictness_warn_logged_into_custom_logger() {
+ when(mock(Foo.class).doIt()).thenReturn(123);
+ }
+
+ @AfterAll
+ static void tearDown() {
+ final List