Java JPA2.0为单元测试禁用会话缓存

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不会创建新的方法。 为了进行正确的测试

我正在为我的服务编写单元测试。g、 :

@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 { ...
    
  • 在本例中,在我的度量值三倍化中,在每次测试和测试时间之后重新创建Spring上下文

  • For development在开发阶段自动关闭缓存

  • 请参见和

    Oops,没有注意实际标题。我做了一些粗略的搜索,无状态会话可能就是您想要使用的。
    @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
    class CacheAffectedTest { ...