春天& JUnit |如何禁用特定测试类的spring test context缓存?

时间:2014-09-09 09:17:10

标签: java spring caching

我的代码有许多集成测试类 - ServiceTest1ServiceTest2 ...,ServiceTestN。 使用相同的测试上下文(MyAppContext.xml),使用spring执行所有测试。

如下面的代码段所示,ServiceTest1测试上下文需要覆盖其中一个bean,并且该更改与ServiceTest1 相关。

执行时,ServiceTest1按预期工作。但是,当执行其他测试(例如代码段中的ServiceTest2)时,由于spring缓存MyAppContext.xml测试上下文而导致ServiceTest1测试上下文操作与其他测试。

我正在寻找一种方法来避免缓存ServiceTest1测试上下文(例如根据@ContextConfiguration使其缓存密钥唯一)。 请注意,完全禁用缓存不是理想的解决方案。

有什么想法吗?

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class ServiceTest1 {

    // some tests ...

    @Configuration
    @ImportResource({"classpath*:MyAppContext.xml"})
    static class Context {

        @Bean
        @Primary
        ServiceOne serviceOne() {
            // instantiate something ...
        }
    }
}


@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath*:MyAppContext.xml"})
public class ServiceTest2 {

    // some tests ...

}

谢谢!

修改:
Spring初始化错误是:

  

java.lang.IllegalStateException:无法加载ApplicationContext

     

...

     

引起:org.springframework.beans.factory.parsing.BeanDefinitionParsingException:配置问题:无法从URL位置导入bean定义[classpath:/ WEB-INF / applicationContext-security]

     

违规资源:URL [file:/path/to/MyAppContext.xml];嵌套异常是org.springframework.beans.factory.parsing.BeanDefinitionParsingException:配置问题:检测到重复。

     

违规资源:类路径资源[WEB-INF / applicationContext-security.xml]

1 个答案:

答案 0 :(得分:4)

使用@DirtiesContext注释,在课程级别添加。

然后在测试类执行后刷新spring应用程序上下文。

文档:http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/test/annotation/DirtiesContext.html