From 47604395f37ab626b498f24c34af6198167d453a Mon Sep 17 00:00:00 2001 From: Andrei Silviu Dragnea Date: Fri, 8 May 2020 03:43:04 +0300 Subject: [PATCH 1/2] Fix JUnit 5 strict stubs check on test failure If the test fails, MockitoExtension should not check for strict stubs at the end of the test. --- .../junit/jupiter/MockitoExtension.java | 17 +++++---- .../java/org/mockitousage/StrictnessTest.java | 36 +++++++++++++++---- 2 files changed, 37 insertions(+), 16 deletions(-) diff --git a/subprojects/junit-jupiter/src/main/java/org/mockito/junit/jupiter/MockitoExtension.java b/subprojects/junit-jupiter/src/main/java/org/mockito/junit/jupiter/MockitoExtension.java index 6219506634..32609c38b4 100644 --- a/subprojects/junit-jupiter/src/main/java/org/mockito/junit/jupiter/MockitoExtension.java +++ b/subprojects/junit-jupiter/src/main/java/org/mockito/junit/jupiter/MockitoExtension.java @@ -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; @@ -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}. @@ -178,7 +178,7 @@ private Optional retrieveAnnotationFromTestClasses(final Extens @Override public void afterEach(ExtensionContext context) { context.getStore(MOCKITO).remove(SESSION, MockitoSession.class) - .finishMocking(); + .finishMocking(context.getExecutionException().orElse(null)); } @Override @@ -186,7 +186,6 @@ public boolean supportsParameter(ParameterContext parameterContext, ExtensionCon return parameterContext.isAnnotated(Mock.class); } - @SuppressWarnings("ConstantConditions") @Override public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException { final Parameter parameter = parameterContext.getParameter(); diff --git a/subprojects/junit-jupiter/src/test/java/org/mockitousage/StrictnessTest.java b/subprojects/junit-jupiter/src/test/java/org/mockitousage/StrictnessTest.java index 560b2f1c73..46b1a0e83b 100644 --- a/subprojects/junit-jupiter/src/test/java/org/mockitousage/StrictnessTest.java +++ b/subprojects/junit-jupiter/src/test/java/org/mockitousage/StrictnessTest.java @@ -4,6 +4,12 @@ */ package org.mockitousage; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.fail; +import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass; + +import java.util.function.Function; + import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -17,21 +23,15 @@ 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; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass; - /** * Test that runs the inner test using a launcher {@see #invokeTestClassAndRetrieveMethodResult}. * 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) @@ -53,6 +53,28 @@ void session_checks_for_strict_stubs() { assertThat(result.getThrowable().get()).isInstanceOf(UnnecessaryStubbingException.class); } + @MockitoSettings(strictness = Strictness.STRICT_STUBS) + static class StrictStubsNotReportedOnTestFailure { + @Mock + private Function rootMock; + + @Test + void should_not_throw_exception_on_strict_stubs_because_of_test_failure() { + Mockito.when(rootMock.apply(10)).thenReturn("Foo"); + fail("Test failed"); + } + } + + @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(AssertionError.class); + assertThat(throwable.getSuppressed()).isEmpty(); + } + @MockitoSettings(strictness = Strictness.STRICT_STUBS) static class ConfiguredStrictStubs { @Nested From c86d015e246b87dc0dd2916fdc7587a1445bee46 Mon Sep 17 00:00:00 2001 From: Szczepan Faber Date: Mon, 11 May 2020 06:43:13 -0700 Subject: [PATCH 2/2] Fortified an assertion --- .../java/org/mockitousage/StrictnessTest.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/subprojects/junit-jupiter/src/test/java/org/mockitousage/StrictnessTest.java b/subprojects/junit-jupiter/src/test/java/org/mockitousage/StrictnessTest.java index 46b1a0e83b..31a5d6a649 100644 --- a/subprojects/junit-jupiter/src/test/java/org/mockitousage/StrictnessTest.java +++ b/subprojects/junit-jupiter/src/test/java/org/mockitousage/StrictnessTest.java @@ -4,12 +4,6 @@ */ package org.mockitousage; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.fail; -import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass; - -import java.util.function.Function; - import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -27,6 +21,11 @@ import org.mockito.junit.jupiter.MockitoSettings; import org.mockito.quality.Strictness; +import java.util.function.Function; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass; + /** * Test that runs the inner test using a launcher {@see #invokeTestClassAndRetrieveMethodResult}. * We then assert on the actual test run output, to see if test actually failed as a result @@ -53,6 +52,9 @@ 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 @@ -61,7 +63,7 @@ static class StrictStubsNotReportedOnTestFailure { @Test void should_not_throw_exception_on_strict_stubs_because_of_test_failure() { Mockito.when(rootMock.apply(10)).thenReturn("Foo"); - fail("Test failed"); + throw new MyAssertionError(); } } @@ -71,7 +73,7 @@ void session_does_not_check_for_strict_stubs_on_test_failure() { assertThat(result.getStatus()).isEqualTo(TestExecutionResult.Status.FAILED); Throwable throwable = result.getThrowable().get(); - assertThat(throwable).isInstanceOf(AssertionError.class); + assertThat(throwable).isInstanceOf(MyAssertionError.class); assertThat(throwable.getSuppressed()).isEmpty(); }