Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow mockito-logger to be configurable as Mockito extension #1430

Merged
merged 1 commit into from Jan 31, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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