Java JPA2.0为单元测试禁用会话缓存
我正在为我的服务编写单元测试。g、 :Java JPA2.0为单元测试禁用会话缓存,java,unit-testing,jpa,translation,Java,Unit Testing,Jpa,Translation,我正在为我的服务编写单元测试。g、 : @Test @Rollback(value = true) public void testMethod() { // insert test data myService.Method(); // read/write from DB // asserts go here } 在应用程序运行时,每次输入方法时都会创建一个新事务。但是在单元测试执行期间-当testMethod进入时。所以方法A不会创建新的方法。 为了进行正确的测试
@Test
@Rollback(value = true)
public void testMethod()
{
// insert test data
myService.Method(); // read/write from DB
// asserts go here
}
在应用程序运行时,每次输入方法时都会创建一个新事务。但是在单元测试执行期间-当testMethod进入时。所以方法A不会创建新的方法。
为了进行正确的测试,我需要在每次调用测试中的服务之前清除缓存。我不想在每次单元测试中调用服务之前编写Session.clear()。这里的最佳实践是什么?EntityManager有一种方法可以删除所有持久性上下文: 清除持久性上下文,使所有托管实体分离。对尚未刷新到数据库的实体所做的更改将不会持久化 如果在该方法之后立即调用查询,它将直接来自数据库。不是从缓存中
如果您想在每次测试之前运行此操作,请考虑使用子单元的JUnit,并在每个<代码>前()/ <代码>或<代码>后面(<)/代码>运行该方法。您可以在所有数据库测试中重复使用它。
有几种方法:@Autowired private CacheManager cacheManager;
public void evictAllCaches(){
for(String name : cacheManager.getCacheNames()){
cacheManager.getCache(name).clear();
}
}
- 对于Spring引导:
Spring.cache.type=NONE
- 或
@DirtiesContext
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
class CacheAffectedTest { ...
请参见和Oops,没有注意实际标题。我做了一些粗略的搜索,无状态会话可能就是您想要使用的。
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
class CacheAffectedTest { ...