Skip to content

Commit

Permalink
Allow mockito-logger configurable as Mockito extension
Browse files Browse the repository at this point in the history
  • Loading branch information
bedla committed Jan 29, 2019
1 parent dad3ef7 commit ee37eed
Show file tree
Hide file tree
Showing 29 changed files with 218 additions and 36 deletions.
Expand Up @@ -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;
Expand All @@ -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
Expand Down
Expand Up @@ -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;

Expand All @@ -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) {
Expand Down Expand Up @@ -75,4 +79,14 @@ InstantiatorProvider2 getInstantiatorProvider() {
AnnotationEngine getAnnotationEngine() {
return annotationEngine;
}

/**
* Returns the logger available for the current runtime.
*
* <p>Returns {@link org.mockito.internal.util.ConsoleMockitoLogger} if no
* {@link org.mockito.plugins.MockitoLogger} extension exists or is visible in the current classpath.</p>
*/
MockitoLogger getMockitoLogger() {
return mockitoLogger;
}
}
Expand Up @@ -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;
Expand Down Expand Up @@ -55,6 +56,16 @@ public static AnnotationEngine getAnnotationEngine() {
return registry.getAnnotationEngine();
}

/**
* Returns the logger available for the current runtime.
*
* <p>Returns {@link org.mockito.internal.util.ConsoleMockitoLogger} if no
* {@link org.mockito.plugins.MockitoLogger} extension exists or is visible in the current classpath.</p>
*/
public static MockitoLogger getMockitoLogger() {
return registry.getMockitoLogger();
}

/**
* @return instance of mockito plugins type
*/
Expand Down
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/org/mockito/internal/junit/JUnitRule.java
Expand Up @@ -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;

Expand Down
Expand Up @@ -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;
Expand Down
Expand Up @@ -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;
Expand Down
Expand Up @@ -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;

Expand Down
Expand Up @@ -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;

Expand Down
4 changes: 2 additions & 2 deletions src/main/java/org/mockito/internal/runners/RunnerFactory.java
Expand Up @@ -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;
Expand Down Expand Up @@ -39,7 +39,7 @@ public MockitoTestListener get() {
public InternalRunner createStrict(Class<?> klass) throws InvocationTargetException {
return create(klass, new Supplier<MockitoTestListener>() {
public MockitoTestListener get() {
return new MismatchReportingTestListener(new ConsoleMockitoLogger());
return new MismatchReportingTestListener(Plugins.getMockitoLogger());
}
});
}
Expand Down
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
}
}
Expand Up @@ -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 {
Expand Down
Expand Up @@ -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 {
Expand Down
Expand Up @@ -4,6 +4,8 @@
*/
package org.mockito.internal.util;

import org.mockito.plugins.MockitoLogger;

public class ConsoleMockitoLogger implements MockitoLogger {

/* (non-Javadoc)
Expand Down
11 changes: 0 additions & 11 deletions src/main/java/org/mockito/internal/util/MockitoLogger.java

This file was deleted.

4 changes: 2 additions & 2 deletions src/main/java/org/mockito/junit/MockitoJUnit.java
Expand Up @@ -5,9 +5,9 @@
package org.mockito.junit;

import org.mockito.Incubating;
import org.mockito.internal.configuration.plugins.Plugins;
import org.mockito.internal.junit.JUnitRule;
import org.mockito.internal.junit.VerificationCollectorImpl;
import org.mockito.internal.util.ConsoleMockitoLogger;
import org.mockito.quality.Strictness;

/**
Expand All @@ -30,7 +30,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);
}

/**
Expand Down
47 changes: 47 additions & 0 deletions src/main/java/org/mockito/plugins/MockitoLogger.java
@@ -0,0 +1,47 @@
/*
* Copyright (c) 2007 Mockito contributors
* This program is made available under the terms of the MIT License.
*/
package org.mockito.plugins;

import org.mockito.Incubating;

/**
* Mockito logger.
*
* <p>By default logs to console</p>
*
* <p>All mockito logging goes through this class and could be customized as usual Mockito plugin.</p>
*
* <h3>Using the extension point</h3>
*
* <p>Suppose you wrote an extension to customize logging, in order to tell Mockito to use it you need to put
* in your <strong>classpath</strong>:
* <ol style="list-style-type: lower-alpha">
* <li>
* The implementation itself, for example <code>org.awesome.mockito.AwesomeLogger</code> that
* extends the <code>MockitoLogger</code>.
* </li>
* <li>
* A file "<code>mockito-extensions/org.mockito.plugins.MockitoLogger</code>". The content of this file is
* exactly a <strong>one</strong> line with the qualified name:
* <code>org.awesome.mockito.AwesomeLogger</code>.
* </li>
* </ol>
* </p>
*
* <p>Note that if several <code>mockito-extensions/org.mockito.plugins.MockitoLogger</code> 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);
}
Expand Up @@ -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;

Expand All @@ -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) {
Expand Down
Expand Up @@ -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.*;
Expand All @@ -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());
}
}
Expand Up @@ -4,6 +4,8 @@
*/
package org.mockito.internal.util;

import org.mockito.plugins.MockitoLogger;

public class SimpleMockitoLogger implements MockitoLogger {

private StringBuilder loggedInfo = new StringBuilder();
Expand Down
Expand Up @@ -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;

Expand Down
Expand Up @@ -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;
Expand All @@ -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")
Expand Down
Expand Up @@ -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;
Expand All @@ -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.",
Expand Down
2 changes: 2 additions & 0 deletions subprojects/extTest/extTest.gradle
Expand Up @@ -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 {
Expand Down

0 comments on commit ee37eed

Please sign in to comment.