[英]JPA 2.0 disable session cache for unit tests
我正在为我的服务编写单元测试,例如:
@Test
@Rollback(value = true)
public void testMethod()
{
// insert test data
myService.Method(); // read/write from DB
// asserts go here
}
在应用程序运行时,每次进入方法 A 时都会创建一个新事务。 但是在单元测试执行期间 - 当测试 testMethod 进入时。 所以方法 A 不会创建新的。 为了进行适当的测试,我需要在每次调用内部测试服务之前清除缓存。我不想在每次单元测试中调用服务之前编写 Session.clear()。 这里的最佳实践是什么?
EntityManager 有一个clear()方法,它将删除所有持久化上下文:
清除持久性上下文,导致所有托管实体分离。 对尚未刷新到数据库的实体所做的更改将不会被持久化。
如果您在该方法之后立即调用查询,它将直接来自数据库。 不是来自缓存。
如果您想在每次测试之前运行它,请考虑通过子类化ExternalResource并在每个before()
或after()
上运行该方法来使用 JUnit @Rule 。 您可以在所有数据库测试中重用它。
有几种方式:
手动驱逐缓存
@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 上下文在每次测试和测试时间后重新创建,我的度量增加了三倍。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.