Java Spring:为什么在每个测试类结束时都不调用@PreDestroy?

Java Spring:为什么在每个测试类结束时都不调用@PreDestroy?,java,spring,spring-mvc,spring-junit,component-scan,Java,Spring,Spring Mvc,Spring Junit,Component Scan,我有一个集成测试类,注释如下 @WebAppConfiguration @ContextConfiguration(classes = {AppConfiguration.class}) @RunWith(SpringJUnit4ClassRunner.class) public class CacheConsumerTest { } 这是我的应用程序配置 @Configuration @ComponentScan(basePackages = {"com.etc.etc.e

我有一个集成测试类,注释如下

@WebAppConfiguration
@ContextConfiguration(classes = {AppConfiguration.class})
@RunWith(SpringJUnit4ClassRunner.class)    
public class CacheConsumerTest {

}
这是我的应用程序配置

@Configuration    
@ComponentScan(basePackages = {"com.etc.etc.etc."})
@EnableWebMvc
public class AppConfiguration {
}
出于某种原因,在
CacheConsumerTest
中的所有测试结束时,没有调用我的
@组件
bean的
@PreDestroy
<代码>@PostConstruct
将在开始时调用,然后再运行任何测试

有人知道问题出在哪里吗?我的一些
@Component
是我希望关闭的后台线程(通过调用其@Predestroy),否则它们在后台执行的工作将导致其他测试类中的后续测试失败

我尝试添加
@DirtiesContext(classMode=classMode.AFTER\u CLASS)
,但没有帮助

编辑:解决了这个问题,我不得不做一个额外的步骤来让DirtiesContext工作:
SpringJUnit4ClassRunner
有一个特性:它缓存所有启动的上下文,并仅在所有测试用例运行结束时销毁它们。原因是新的spring上下文的启动通常需要几秒钟,这会显著增加整个套件所需的时间

因此,如果您真的需要它,您可能应该扩展
SpringJUnit4ClassRunner
,使其不缓存上下文。我猜这个跑步者可能已经有了这样的功能,但不幸的是我现在无法检查。试着检查它的代码。这并不复杂,也许你会很快找到解决方案

编辑:

只是用
@DirtiesContext
注释了您的测试用例。看看细节