6

我正在为我的服务编写单元测试,例如:

@Test
@Rollback(value = true)
public void testMethod()
{
   // insert test data

    myService.Method(); // read/write from DB

   // asserts go here
}

在应用程序运行时,每次输入方法 A 时都会创建一个新事务。但是在单元测试执行期间 - 当测试 testMethod 进入时。所以方法A不会创建新的。为了进行正确的测试,我需要在每次调用测试内部的服务之前清除缓存。我不想在每个单元测试中的任何服务调用之前编写 Session.clear() 。这里的最佳实践是什么?

4

2 回答 2

11

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

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

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

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

于 2013-07-26T11:49:14.733 回答
2

有几种方法:

  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 和集成测试以及@DirtiesContext 快速指南

于 2019-11-20T21:34:57.980 回答