【问题标题】:How to simulate a class change in an JPA integration test?如何在 JPA 集成测试中模拟类更改?
【发布时间】:2015-12-11 07:24:55
【问题描述】:

我将应用程序启动时EntityManager.getMetamodel 返回的javax.persistence.metamodel.Metamodel 对象与我在每次应用程序关闭时使用XMLEncoder 存储到文件中的持久实例进行比较。目的是检测类的变化(这将导致不同的Metamodels)。目的是警告用户持久性可能会失败,因为需要修改或重新生成架构。

鉴于以下事实,我如何在集成测试中模拟这种变化:

  • 类加载不支持将类 X 加载为类 Y,因此我需要在不同的项目中定义两个类。那会让我依赖构建工具(例如maven
  • 反射不允许删除类字段和方法

我正在寻找一种可移植的,即跨 JPA 提供程序的解决方案,即 hibernatehibernate.hbm2ddl.auto 不是一个选项。

我在带有 Linux 4.3 的 Ubuntu 15.10 上使用带有 JPA 2.1 的 Java 7。

【问题讨论】:

  • 我想知道,你的真正目标是什么? “在应用程序开始时” - 我是否理解得很好,您在每个应用程序开始之前都在重复测试?只检查数据库中的一些版本字段不是更容易吗?你想检查这两个 - 字段添加到数据库中,但不在类中(未映射)或仅以其他方式?
  • 检查这个答案 - stackoverflow.com/a/2116653/384674
  • @Betlista 也许检查版本字段更容易。我仍然需要在我的集成测试中生成一个类被更改的情况,这就是我的问题所在。我可以更改数据库中的版本字段,但这会在它中作弊。除了检测数据库中类的更改之外,我不想检查任何其他内容。背景是我希望第三方也能够提供实体模型。我在问题中添加了关于 hibernate.hbm2ddl.auto 的注释。好电话,不过,谢谢。

标签: java maven jpa


【解决方案1】:

让我重新表述一下这个问题(请检查我是否遗漏了什么)。

  1. 您有/想要编写一个组件,用于检查实体类是否与数据库同步(无论这意味着什么)
  2. 您(基本上)在问,如何测试此类组件

如我所见,您选择了困难的路径(类修改)。

但是,如果我正确理解了您的目标,为什么不以某种状态初始化 DB 并运行您的组件说好的,然后在另一个测试中以不同的状态初始化 DB 以检查您的组件是否发现不一致?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-07
    • 2011-09-30
    • 1970-01-01
    • 2019-05-21
    • 2012-04-25
    • 1970-01-01
    • 2021-07-05
    • 2012-08-15
    相关资源
    最近更新 更多