JPA 2.0禁用单元测试的会话缓存

时间:2013-07-23 15:21:25

标签: java unit-testing jpa translation

我正在为我的服务编写单元测试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()。这里最好的最佳做法是什么?

2 个答案:

答案 0 :(得分:4)

EntityManager有一个方法clear(),它将删除所有持久化上下文:

  

清除持久性上下文,导致所有托管实体分离。对未刷新到数据库的实体所做的更改将不会保留。

如果您在该方法之后立即调用查询,它将直接来自数据库。不是来自缓存。

如果要在每次测试之前运行此操作,请考虑通过继承@Rule并在每个before()after()上运行该方法来使用JUnit ExternalResource。您可以在数据库测试中重复使用它。

答案 1 :(得分:1)

有几种方法:

  1. 手动退出缓存

    @Autowired private CacheManager cacheManager;
    
    public void evictAllCaches(){ 
       for(String name : cacheManager.getCacheNames()){
          cacheManager.getCache(name).clear(); 
       } 
    }
    
  2. 为集成测试配置文件关闭缓存

    • 对于Spring Boot:spring.cache.type=NONE
        /** * Disabling cache for integration test */ 
        @Bean public CacheManager cacheManager() {
           return new NoOpCacheManager(); 
        }
  1. 使用@DirtiesContext

    @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
    class CacheAffectedTest { ...
    

在这种情况下,在每次测试和测试时间(我的测量三倍)之后都会重新创建Spring上下文。

  1. 开发Spring Boot Dev Tools会在开发阶段自动关闭缓存。

请参见Spring Cache and Integration TestingA Quick Guide to @DirtiesContext