我正在为我的服务编写单元测试e。 G。 :
@Test
@Rollback(value = true)
public void testMethod()
{
// insert test data
myService.Method(); // read/write from DB
// asserts go here
}
在应用程序运行时,每次输入方法A时都会创建一个新事务。但在单元测试执行期间 - 测试testMethod进入时。因此方法A不会创建新的方法。 为了进行正确的测试,我需要在每次调用test之前清除缓存。我不想在每次单元测试中调用服务之前编写Session.clear()。这里最好的最佳做法是什么?
答案 0 :(得分:4)
EntityManager有一个方法clear(),它将删除所有持久化上下文:
清除持久性上下文,导致所有托管实体分离。对未刷新到数据库的实体所做的更改将不会保留。
如果您在该方法之后立即调用查询,它将直接来自数据库。不是来自缓存。
如果要在每次测试之前运行此操作,请考虑通过继承@Rule并在每个before()
或after()
上运行该方法来使用JUnit ExternalResource。您可以在数据库测试中重复使用它。
答案 1 :(得分:1)
有几种方法:
手动退出缓存
@Autowired private CacheManager cacheManager;
public void evictAllCaches(){
for(String name : cacheManager.getCacheNames()){
cacheManager.getCache(name).clear();
}
}
为集成测试配置文件关闭缓存
spring.cache.type=NONE
/** * Disabling cache for integration test */
@Bean public CacheManager cacheManager() {
return new NoOpCacheManager();
}
使用@DirtiesContext
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
class CacheAffectedTest { ...
在这种情况下,在每次测试和测试时间(我的测量三倍)之后都会重新创建Spring上下文。
请参见Spring Cache and Integration Testing和A Quick Guide to @DirtiesContext