1.背景
项目中在写测试用例的时候遇到了一个问题,我用spring初始化的h2数据库,当前一个测试用例运行过后,数据被修改,就变成了脏数据,如果后一个测试用例再使用这条数据就可能无法通过测试。同样,如果前一个用例修改了spring的bean属性,后面一个测试用例同样会有问题。基于这样的情况,我可能希望每次运行测试用例spring的上下文都能被重新初始化一下,这样可以保证一个清洁的spring上下文环境。
2.@DirtiesContext
于是我现了spring提供了@DirtiesContext这样一个注解。@DirtiesContext是一个spring测试注释,用于指示应在每次测试运行后删除并重新加载应用程序上下文缓存。 删除的应用程序上下文也将被关闭。@DirtiesContext可以在方法级别和类级别声明。
3.@DirtiesContext工作流程
如果测试方法使用@DirtiesContext注释,或者测试类使用@DirtiesContext注释并且classMode设置为ClassMode.AFTER_EACH_TEST_METHOD,则测试上下文的应用程序上下文将被标记为脏并关闭。
如果在类级别声明@DirtiesContext且classMode设置为ClassMode.AFTER_CLASS,则在运行测试类的所有测试之后将关闭应用程序上下文。
4.解决问题
所以根据上面的了解,我只需要在每个类上增加@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)即可保证每次运行测试用例都会重新初始spring上下文。
5.最后
虽然使用@DirtiesContext,可以保证每个test class的执行上下文的独立性、隔离性,但是也会有让测试运行速度变慢的副作用。所以在使用@DirtiesContext前,弄清楚你是否真的需要使用它。
具体示例参考
https://www.javarticles.com/2016/03/spring-dirtiescontext-annotation-example.html