测试后清除Spring应用程序上下文

时间:2018-02-09 09:10:39

标签: spring junit spring-test applicationcontext junit5

如何使用Junit5和Spring Boot在每次测试执行后清除应用程序上下文?我希望测试中创建的所有bean在执行后都被销毁,因为我在多个测试中创建了相同的bean。我不希望所有测试都有一个配置类,而是每个测试的配置类,如下所示。

@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = MyTest.ContextConfiguration.class)
public class MyTest{
   ...
   public static class ContextConfiguration {
     // beans defined here... 

   }
}

放置@DirtiesContext(classMode = BEFORE_CLASS)不适用于Junit5。

2 个答案:

答案 0 :(得分:3)

您声称两次import javax.annotation.PreDestroy; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInfo; import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.annotation.DirtiesContext.ClassMode; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; @ExtendWith(SpringExtension.class) @ContextConfiguration @DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD) class MyTest { @Test void test1(TestInfo testInfo) { System.err.println(testInfo.getDisplayName()); } @Test void test2(TestInfo testInfo) { System.err.println(testInfo.getDisplayName()); } @Configuration static class Config { @Bean MyComponent myComponent() { return new MyComponent(); } } } class MyComponent { @PreDestroy void destroy() { System.err.println("Destroying " + this); } } 不起作用;但是,以下显示它的工作原理。

test1(TestInfo)
Destroying MyComponent@dc9876b
test2(TestInfo)
Destroying MyComponent@30b6ffe0

执行上述测试类会导致输出到 STDERR ,类似于以下内容。

@DirtiesContext(classMode = AFTER_EACH_TEST_METHOD)

因此,@DirtiesContext(classMode = BEFORE_CLASS)确实是您在每次测试执行后清除应用程序上下文的方式"。

  

使用classMode = BEFORE_CLASS并不适用于Junit5。

根据我的测试,classMode = BEFORE_CLASS适用于TestNG,JUnit 4和JUnit Jupiter(a.k.a.,JUnit 5)。

所以,如果这在你的测试类中不起作用,那就是你应该report to the Spring Team的错误。

你有什么例子可以说明它不起作用吗?

仅供参考:如果已在当前正在执行的测试套件中创建了上下文,则使用ApplicationContext只会有意义。否则,您正在指示Spring关闭并从不存在的缓存中删除[] ...就在Spring实际创建它之前。

此致

Sam( Spring TestContext Framework的作者

答案 1 :(得分:1)

根据docs,请尝试@DirtiesContext(classMode = AFTER_EACH_TEST_METHOD)