繁体   English   中英

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

[英]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 您可以在所有数据库测试中重用它。

有几种方式:

  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 的快速指南

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM