【问题标题】:Skip JPA life cycle methods while running tests在运行测试时跳过 JPA 生命周期方法
【发布时间】:2020-02-19 15:46:00
【问题描述】:

我有一个实体 Post 并注册了一个事件监听器,如下所示。

@EntityListeners({EntityAuditor.class})
@Entity 
class Post {
  ...
}

这是我的 EntityAuditor 监听器类的样子:

public class EntityAuditor {
  @PostPersist
  void publishToKafka(Object object) {
      // publish new object to Kafka
  }
}

我不希望在我的单元/集成测试尝试创建新帖子时调用它。有没有一种方法可以跳过 JPA 生命周期挂钩或仅用于测试的事件侦听器?

【问题讨论】:

  • 你能试试吗?
  • 嘿,对不起..错过了这个。我会尽力让你知道
  • 嘿@areus,即使将此配置放入测试目录后,我的事件侦听器仍在运行
  • 您确定 META-INF/orm.xml 在运行测试时在您的类路径中吗?您还可以尝试创建一个 NoOpEntityAuditor 并将其设置在 <entity-listeners> 元素上以覆盖实体侦听器,而不是一个空列表

标签: spring hibernate spring-boot jpa spring-data-jpa


【解决方案1】:

根据 JPA 规范,EntityListeners 注释可以被持久化对象/关系中<entity> 元素的<entity-listeners> 子元素覆盖 映射文件。

因此,您应该包含一个 META-INF/orm.xml 文件,仅在您的测试环境中,并为您的实体设置一个空的 <entity-listeners>。像这样的

<?xml version="1.0" encoding="UTF-8"?>
<entity-mappings xmlns="http://xmlns.jcp.org/xml/ns/persistence/orm"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence/orm http://xmlns.jcp.org/xml/ns/persistence/orm_2_2.xsd"
                 version="2.2">
    <entity class="yourpackage.Post">
        <entity-listeners />
    </entity>
</entity-mappings>

【讨论】:

    猜你喜欢
    • 2019-02-12
    • 2011-08-12
    • 2014-08-05
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    相关资源
    最近更新 更多