Skip to content

Commit

Permalink
Merge pull request #1928 from andreisilviudragnea/fix-junit5-strict-s…
Browse files Browse the repository at this point in the history
…tubs

JUnit 5 strict stubs check should not suppress the regular test failure
  • Loading branch information
mockitoguy committed May 14, 2020
2 parents 56b0e54 + c86d015 commit 356228a
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 11 deletions.
Expand Up @@ -5,6 +5,13 @@
package org.mockito.junit.jupiter;


import static org.junit.jupiter.api.extension.ExtensionContext.Namespace.create;
import static org.junit.platform.commons.support.AnnotationSupport.findAnnotation;

import java.lang.reflect.Parameter;
import java.util.List;
import java.util.Optional;

import org.junit.jupiter.api.extension.AfterEachCallback;
import org.junit.jupiter.api.extension.BeforeEachCallback;
import org.junit.jupiter.api.extension.ExtensionContext;
Expand All @@ -21,13 +28,6 @@
import org.mockito.junit.MockitoJUnitRunner;
import org.mockito.quality.Strictness;

import java.lang.reflect.Parameter;
import java.util.List;
import java.util.Optional;

import static org.junit.jupiter.api.extension.ExtensionContext.Namespace.create;
import static org.junit.platform.commons.support.AnnotationSupport.findAnnotation;

/**
* Extension that initializes mocks and handles strict stubbings. This extension is the JUnit Jupiter equivalent
* of our JUnit4 {@link MockitoJUnitRunner}.
Expand Down Expand Up @@ -178,15 +178,14 @@ private Optional<MockitoSettings> retrieveAnnotationFromTestClasses(final Extens
@Override
public void afterEach(ExtensionContext context) {
context.getStore(MOCKITO).remove(SESSION, MockitoSession.class)
.finishMocking();
.finishMocking(context.getExecutionException().orElse(null));
}

@Override
public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
return parameterContext.isAnnotated(Mock.class);
}

@SuppressWarnings("ConstantConditions")
@Override
public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException {
final Parameter parameter = parameterContext.getParameter();
Expand Down
Expand Up @@ -17,8 +17,8 @@
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.exceptions.misusing.UnnecessaryStubbingException;
import org.mockito.junit.jupiter.MockitoSettings;
import org.mockito.junit.jupiter.MockitoExtension;
import org.mockito.junit.jupiter.MockitoSettings;
import org.mockito.quality.Strictness;

import java.util.function.Function;
Expand All @@ -31,7 +31,6 @@
* We then assert on the actual test run output, to see if test actually failed as a result
* of our extension.
*/
@SuppressWarnings("ConstantConditions")
class StrictnessTest {

@MockitoSettings(strictness = Strictness.STRICT_STUBS)
Expand All @@ -53,6 +52,31 @@ void session_checks_for_strict_stubs() {
assertThat(result.getThrowable().get()).isInstanceOf(UnnecessaryStubbingException.class);
}

static class MyAssertionError extends AssertionError {
}

@MockitoSettings(strictness = Strictness.STRICT_STUBS)
static class StrictStubsNotReportedOnTestFailure {
@Mock
private Function<Integer, String> rootMock;

@Test
void should_not_throw_exception_on_strict_stubs_because_of_test_failure() {
Mockito.when(rootMock.apply(10)).thenReturn("Foo");
throw new MyAssertionError();
}
}

@Test
void session_does_not_check_for_strict_stubs_on_test_failure() {
TestExecutionResult result = invokeTestClassAndRetrieveMethodResult(StrictStubsNotReportedOnTestFailure.class);

assertThat(result.getStatus()).isEqualTo(TestExecutionResult.Status.FAILED);
Throwable throwable = result.getThrowable().get();
assertThat(throwable).isInstanceOf(MyAssertionError.class);
assertThat(throwable.getSuppressed()).isEmpty();
}

@MockitoSettings(strictness = Strictness.STRICT_STUBS)
static class ConfiguredStrictStubs {
@Nested
Expand Down

0 comments on commit 356228a

Please sign in to comment.