diff --git a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/mock/mockito/MockitoTestExecutionListener.java b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/mock/mockito/MockitoTestExecutionListener.java index 45712061c92..975d916b744 100644 --- a/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/mock/mockito/MockitoTestExecutionListener.java +++ b/spring-boot-project/spring-boot-test/src/main/java/org/springframework/boot/test/mock/mockito/MockitoTestExecutionListener.java @@ -43,6 +43,7 @@ import org.springframework.util.ReflectionUtils.FieldCallback; * * @author Phillip Webb * @author Andy Wilkinson + * @author Moritz Halbritter * @since 1.4.2 * @see ResetMocksTestExecutionListener */ @@ -57,12 +58,13 @@ public class MockitoTestExecutionListener extends AbstractTestExecutionListener @Override public void prepareTestInstance(TestContext testContext) throws Exception { + closeMocks(testContext); initMocks(testContext); injectFields(testContext); } @Override - public void beforeTestMethod(TestContext testContext) throws Exception { + public void beforeTestMethod(TestContext testContext) { if (Boolean.TRUE.equals( testContext.getAttribute(DependencyInjectionTestExecutionListener.REINJECT_DEPENDENCIES_ATTRIBUTE))) { initMocks(testContext); @@ -72,10 +74,7 @@ public class MockitoTestExecutionListener extends AbstractTestExecutionListener @Override public void afterTestMethod(TestContext testContext) throws Exception { - Object mocks = testContext.getAttribute(MOCKS_ATTRIBUTE_NAME); - if (mocks instanceof AutoCloseable closeable) { - closeable.close(); - } + closeMocks(testContext); } private void initMocks(TestContext testContext) { @@ -84,6 +83,13 @@ public class MockitoTestExecutionListener extends AbstractTestExecutionListener } } + private void closeMocks(TestContext testContext) throws Exception { + Object mocks = testContext.getAttribute(MOCKS_ATTRIBUTE_NAME); + if (mocks instanceof AutoCloseable closeable) { + closeable.close(); + } + } + private boolean hasMockitoAnnotations(TestContext testContext) { MockitoAnnotationCollection collector = new MockitoAnnotationCollection(); ReflectionUtils.doWithFields(testContext.getTestClass(), collector); @@ -126,7 +132,7 @@ public class MockitoTestExecutionListener extends AbstractTestExecutionListener private final Set annotations = new LinkedHashSet<>(); @Override - public void doWith(Field field) throws IllegalArgumentException, IllegalAccessException { + public void doWith(Field field) throws IllegalArgumentException { for (Annotation annotation : field.getDeclaredAnnotations()) { if (annotation.annotationType().getName().startsWith("org.mockito")) { this.annotations.add(annotation); diff --git a/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/mock/mockito/MockitoTestExecutionListenerIntegrationTests.java b/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/mock/mockito/MockitoTestExecutionListenerIntegrationTests.java new file mode 100644 index 00000000000..4de401b078a --- /dev/null +++ b/spring-boot-project/spring-boot-test/src/test/java/org/springframework/boot/test/mock/mockito/MockitoTestExecutionListenerIntegrationTests.java @@ -0,0 +1,71 @@ +/* + * Copyright 2012-2024 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.springframework.boot.test.mock.mockito; + +import java.util.UUID; + +import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.MethodOrderer; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Order; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestMethodOrder; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.MockedStatic; + +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Integration tests for {@link MockitoTestExecutionListener}. + * + * @author Moritz Halbritter + */ +@ExtendWith(SpringExtension.class) +class MockitoTestExecutionListenerIntegrationTests { + + @Nested + @TestMethodOrder(MethodOrderer.OrderAnnotation.class) + class DisabledTests { + + private static final UUID uuid = UUID.randomUUID(); + + @Mock + private MockedStatic mockedStatic; + + @Test + @Order(1) + @Disabled + void shouldReturnConstantValueDisabled() { + this.mockedStatic.when(UUID::randomUUID).thenReturn(uuid); + UUID result = UUID.randomUUID(); + assertThat(result).isEqualTo(uuid); + } + + @Test + @Order(2) + void shouldReturnConstantValue() { + this.mockedStatic.when(UUID::randomUUID).thenReturn(uuid); + UUID result = UUID.randomUUID(); + assertThat(result).isEqualTo(uuid); + } + + } + +}