blob: d87289fc5c7a699d7acb2f491413175dda67eee9 [file] [log] [blame]
/*
* Copyright (c) 2016 Mockito contributors
* This program is made available under the terms of the MIT License.
*/
package org.mockito.internal.runners;
import org.junit.runner.Description;
import org.junit.runner.manipulation.Filter;
import org.junit.runner.manipulation.NoTestsRemainException;
import org.junit.runner.notification.RunNotifier;
import org.mockito.Mockito;
import org.mockito.internal.junit.UnnecessaryStubbingsReporter;
import org.mockito.internal.runners.util.FailureDetector;
public class StrictRunner implements InternalRunner {
private final Class<?> testClass;
private final InternalRunner runner;
private boolean filterRequested;
/**
* @param runner - the runner to wrap around
* @param testClass - for reporting purposes
*/
public StrictRunner(InternalRunner runner, Class<?> testClass) {
this.runner = runner;
this.testClass = testClass;
}
public void run(RunNotifier notifier) {
//TODO need to be able to opt in for full stack trace instead of just relying on the stack trace filter
UnnecessaryStubbingsReporter reporter = new UnnecessaryStubbingsReporter();
FailureDetector listener = new FailureDetector();
Mockito.framework().addListener(reporter);
try {
// add listener that detects test failures
notifier.addListener(listener);
runner.run(notifier);
} finally {
Mockito.framework().removeListener(reporter);
}
if (!filterRequested && listener.isSuccessful()) {
//only report when:
//1. if all tests from given test have ran (filter requested is false)
// Otherwise we would report unnecessary stubs even if the user runs just single test from the class
//2. tests are successful (we don't want to add an extra failure on top of any existing failure, to avoid confusion)
reporter.validateUnusedStubs(testClass, notifier);
}
}
public Description getDescription() {
return runner.getDescription();
}
public void filter(Filter filter) throws NoTestsRemainException {
filterRequested = true;
runner.filter(filter);
}
}