【问题标题】:OpenJPA, Jersey, JUnit: Using a different persistence unit for my unit tests?OpenJPA、Jersey、JUnit:为我的单元测试使用不同的持久性单元?
【发布时间】:2010-08-12 16:35:20
【问题描述】:

我正在使用 OpenJPA 2.0.0、Jersey 1.3 和 JUnit 4.8.1 构建应用程序。

我已经设置好了,所以我在我的 persistence.xml 中定义了两个不同的持久性单元:“default”和“unittest”。默认设置为连接到 Oracle 实例,而 unittest 设置为连接到本地 H2DB 嵌入式数据库文件。我这样做是为了始终从一个干净的数据库开始我的单元测试,其中包含某些已知数据,这些数据可以在每次单元测试运行之间被覆盖。

问题是现在我想使用 Jersey 测试框架来测试我的实际 web 服务,而不仅仅是程序的较低层。我的根资源类不加载 unittest 持久性单元,它们总是加载默认值。

所以我可能需要做的是注入根资源类哪个持久化单元应该用于实例化EntityManager,然后在我运行我的测试,但否则注入默认值。但我想不出任何好的方法来做到这一点。

我是 Java EE 开发的新手,这可能很明显。

有什么帮助吗?

【问题讨论】:

  • EntityManager 或者 EntityManagerFactory 是从哪里来的?您是通过调用 Persistence.createEntityManagerFactory() 创建它,还是由某个框架注入它?您没有在问题中提及任何类型的框架。

标签: java dependency-injection junit jersey openjpa


【解决方案1】:

我认为应该可以在 src/test/resources/META-INF 中创建第二个 persistence.xml。

如果我理解正确,maven 会将目标/测试类放在目标/类之前的类路径中,这样在单元测试中,只会读取您的测试 persistence.xml。这样您就可以使用相同的持久性单元名称,但配置不同。

src/main/resources/
    META-INF
        persistence.xml  <-- for actual application

src/test/resources/
    META-INF
        persistence.xml  <-- for unit tests

编辑:

哎呀,我被另一个答案欺骗了相信你使用了 maven。如果你不是,忘记我说的话......

【讨论】:

    【解决方案2】:

    你在使用 Maven 吗? 如果是,那么有一个技巧可以让您“读取”Java 类中的 POM 值。 这对我来说非常有用,您只需在 POM 中设置您的持久性单元名称,在测试期间设置一个不同的名称,就是这样。

    Maven variables in java context

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-04
      • 2013-02-15
      • 2014-12-18
      • 1970-01-01
      相关资源
      最近更新 更多