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.
All mockito logging goes through this class and could be customized as usual Mockito plugin.
+ *
+ *
Using the extension point
+ *
+ *
Suppose you wrote an extension to customize logging, in order to tell Mockito to use it you need to put
+ * in your classpath:
+ *
+ *
+ * The implementation itself, for example org.awesome.mockito.AwesomeLogger that
+ * extends the MockitoLogger.
+ *
+ *
+ * A file "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