5

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

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

}

这是我的 AppConfiguration

@Configuration    
@ComponentScan(basePackages = {"com.etc.etc.etc."})
@EnableWebMvc
public class AppConfiguration {
}

出于某种原因,在所有测试结束时,我的@Componentbean都没有被调用。然而,在运行任何测试之前,它在开始时被调用。@PreDestroyCacheConsumerTest@PostConstruct

任何人都知道问题可能是什么?我的一些是@Component我想关闭的后台线程(通过调用它的@Predestroy),否则他们在后台所做的工作将导致其他测试类中的后续测试失败。

我试过添加@DirtiesContext(classMode=ClassMode.AFTER_CLASS) ,但没有帮助。

编辑:找出问题所在,我必须做一个额外的步骤才能使 DirtiesContext 工作: Spring @DirtiesContext 是否重新加载 Spring 上下文?

4

1 回答 1

8

SpringJUnit4ClassRunner有一个特点:它缓存所有启动的上下文并仅在所有测试用例运行结束时销毁它们。原因是通常启动新的 spring 上下文可能需要几秒钟,这会显着增加整个套件所需的时间。

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

编辑:

刚刚用@DirtiesContext. 在这里查看详细信息。

于 2014-03-31T22:16:31.217 回答