diff --git a/spring-test/src/test/java/org/springframework/test/context/cache/ContextFailureThresholdTests.java b/spring-test/src/test/java/org/springframework/test/context/cache/ContextFailureThresholdTests.java index 72f778d1ee..a240637e16 100644 --- a/spring-test/src/test/java/org/springframework/test/context/cache/ContextFailureThresholdTests.java +++ b/spring-test/src/test/java/org/springframework/test/context/cache/ContextFailureThresholdTests.java @@ -16,64 +16,158 @@ package org.springframework.test.context.cache; +import java.util.concurrent.atomic.AtomicInteger; + import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Disabled; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.MethodOrderer.OrderAnnotation; -import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestMethodOrder; +import org.junit.platform.testkit.engine.EngineTestKit; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.core.SpringProperties; +import org.springframework.test.context.TestExecutionListeners; import org.springframework.test.context.junit.jupiter.SpringJUnitConfig; +import org.springframework.test.context.support.DependencyInjectionTestExecutionListener; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.platform.engine.discovery.DiscoverySelectors.selectClass; +import static org.springframework.test.context.CacheAwareContextLoaderDelegate.CONTEXT_FAILURE_THRESHOLD_PROPERTY_NAME; +import static org.springframework.test.context.CacheAwareContextLoaderDelegate.DEFAULT_CONTEXT_FAILURE_THRESHOLD; import static org.springframework.test.context.cache.ContextCacheTestUtils.assertContextCacheStatistics; import static org.springframework.test.context.cache.ContextCacheTestUtils.resetContextCache; /** + * Integration tests for context failure threshold support. + * * @author Sam Brannen * @since 6.1 */ -@SpringJUnitConfig -@TestMethodOrder(OrderAnnotation.class) -@Disabled class ContextFailureThresholdTests { - @BeforeAll - static void verifyInitialCacheState() { - resetContextCache(); - assertContextCacheStatistics("BeforeAll", 0, 0, 0); - } + private static final AtomicInteger loadCount = new AtomicInteger(0); - @AfterAll - static void verifyFinalCacheState() { - assertContextCacheStatistics("AfterAll", 0, 0, 3); - resetContextCache(); + + @BeforeEach + @AfterEach + void resetFlag() { + loadCount.set(0); + SpringProperties.setProperty(CONTEXT_FAILURE_THRESHOLD_PROPERTY_NAME, null); } @Test - @Order(1) - void test1() { + void defaultThreshold() { + assertThat(loadCount.get()).isZero(); + + EngineTestKit.engine("junit-jupiter")// + .selectors(selectClass(PassingTestCase.class))// 2 passing + .selectors(selectClass(FailingTestCase.class))// 3 failing + .execute()// + .testEvents()// + .assertStatistics(stats -> stats.started(5).succeeded(2).failed(3)); + assertThat(loadCount.get()).isEqualTo(DEFAULT_CONTEXT_FAILURE_THRESHOLD); } @Test - @Order(2) - void test2() { + void customThreshold() { + assertThat(loadCount.get()).isZero(); + + int threshold = 2; + SpringProperties.setProperty(CONTEXT_FAILURE_THRESHOLD_PROPERTY_NAME, Integer.toString(threshold)); + + EngineTestKit.engine("junit-jupiter")// + .selectors(selectClass(PassingTestCase.class))// 2 passing + .selectors(selectClass(FailingTestCase.class))// 3 failing + .execute()// + .testEvents()// + .assertStatistics(stats -> stats.started(5).succeeded(2).failed(3)); + assertThat(loadCount.get()).isEqualTo(threshold); } @Test - @Order(3) - void test3() { + void thresholdEffectivelyDisabled() { + assertThat(loadCount.get()).isZero(); + + SpringProperties.setProperty(CONTEXT_FAILURE_THRESHOLD_PROPERTY_NAME, "999999"); + + EngineTestKit.engine("junit-jupiter")// + .selectors(selectClass(PassingTestCase.class))// 2 passing + .selectors(selectClass(FailingTestCase.class))// 3 failing + .execute()// + .testEvents()// + .assertStatistics(stats -> stats.started(5).succeeded(2).failed(3)); + assertThat(loadCount.get()).isEqualTo(3); } - @Configuration - static class FailingConfig { + @SpringJUnitConfig + @TestExecutionListeners(DependencyInjectionTestExecutionListener.class) + static class PassingTestCase { - @Bean - String explosiveString() { - throw new RuntimeException("Boom!"); + @BeforeAll + static void verifyInitialCacheState() { + resetContextCache(); + assertContextCacheStatistics("BeforeAll", 0, 0, 0); + } + + @AfterAll + static void verifyFinalCacheState() { + assertContextCacheStatistics("AfterAll", 1, 1, 1); + resetContextCache(); + } + + @Test + void test1() {} + + @Test + void test2() {} + + @Configuration + static class PassingConfig { + } + } + + @SpringJUnitConfig + @TestExecutionListeners(DependencyInjectionTestExecutionListener.class) + @TestMethodOrder(OrderAnnotation.class) + static class FailingTestCase { + + @BeforeAll + static void verifyInitialCacheState() { + resetContextCache(); + assertContextCacheStatistics("BeforeAll", 0, 0, 0); + } + + @AfterAll + static void verifyFinalCacheState() { + assertContextCacheStatistics("AfterAll", 0, 0, 3); + resetContextCache(); + } + + @Test + void test1() {} + + @Test + void test2() {} + + @Test + void test3() {} + + @Configuration + static class FailingConfig { + + FailingConfig() { + loadCount.incrementAndGet(); + } + + @Bean + String explosiveString() { + throw new RuntimeException("Boom!"); + } } }