如何使用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。
答案 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)