当前位置: 首页 > 知识库问答 >
问题:

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

党宇定
2023-03-14

我正在为我的服务编写单元测试

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

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

   // asserts go here
}

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

共有2个答案

吕鹏
2023-03-14

有几种方法

>

  • 手动退出缓存

    @Autowired private CacheManager cacheManager;
    
    public void evictAllCaches(){ 
       for(String name : cacheManager.getCacheNames()){
          cacheManager.getCache(name).clear(); 
       } 
    }
    

    关闭集成测试配置文件的缓存

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

    使用@DirtiesContext

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

    在这种情况下,Spring上下文在我的度量中的每个测试和测试时间增加三倍后重新创建。

    参见Spring缓存和集成测试以及@DirtiesContext快速指南

  • 颛孙晗昱
    2023-03-14

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

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

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

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

     类似资料:
    • 在Spring Boot应用程序中,我访问Hibernate会话,如下所示:https://stackoverflow.com/a/33881946/272180 我的单元测试类类似于以下自动取款机: 引用具有用于运行Spring Boot应用程序的main方法的类。

    • 问题内容: 在Python中使用模块时,如何暂时禁用单个单元测试? 问题答案: 单个的测试方法或类都可以使用装饰器禁用。 有关其他选项,请参阅文档“跳过测试和预期的失败”。

    • 问题内容: 问题: 当我两次运行相同的go测试时,第二次运行根本没有完成。结果是第一次运行时的缓存结果。 链接 我已经检查过https://golang.org/cmd/go/#hdr- Testing_flags, 但是没有cli标志用于此目的。 题: 是否有可能强制执行测试以始终运行测试而不缓存测试结果。 问题答案: 测试标志docs中描述了一些选项: :使所有测试结果失效 在测试运行中使用不

    • Android Studio 1.1 添加了单元测试支持,详细请看 Unit testing support。本章的其余部分描述的是 “instrumentation tests”。利用 Instrumentation 测试框架可以构建独立的测试 APK 并运行在真实设备(或模拟器)中进行测试。

    • 英文原文:http://emberjs.com/guides/testing/unit/ 单元测试用于测试代码的一个小片段,确保其功能正常。与集成测试不同,单元测试被限定在一个范围内,并且不需要Ember应用运行。 全局 vs 模块 过去如果没有作为一个全局变量加载整个Ember应用,要对应用进行测试非常困难。通过使用模块(CommonJS,AMD等)来编写应用,可以只加载被测试的部分,而不用将其

    • 我正在尝试创建一个简单的安全spring boot网络项目。我可以很好地启动应用程序,安全性也很好地工作。但是,我有一些组件想要在没有安全性的情况下进行测试(或者完全测试--我根本无法使测试工作)。 我得到一个异常,指示它找不到ObjectPostProcessor,因此无法调出容器。 原因:org.SpringFramework.Beans.Factory.NoSuchBeanDefinitio