【问题标题】:How to define a test datasource for an embedded EJB container如何为嵌入式 EJB 容器定义测试数据源
【发布时间】:2013-02-07 10:00:49
【问题描述】:

我正在尝试使用嵌入式 EJB 容器测试我的 EJB。在生产中,我依赖于应用服务器中配置的 JTA 数据源。但是,在测试期间,我想连接到不同的数据库(内存 Derby)。

问题是我看不到如何告诉 EJB 容器覆盖我的生产 persistence.xml(在 src/main/resources/META-INF 中)中定义的 JTA 数据源并连接到我的内存中德比 DB。 JTA 数据源在 persistence.xml 文件中定义如下:

<jta-data-source>jdbc/myDS</jta-data-source>

尝试 1:使用测试 persistence.xml

我尝试创建一个测试 persistence.xml 文件(在 src/test/resources/META-INF 中),它定义:

<property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.EmbeddedDriver" />
<property name="javax.persistence.jdbc.url" value="jdbc:derby:memory:myDataBase;create=true;" />
<property name="javax.persistence.jdbc.user" value="sa" />
<property name="javax.persistence.jdbc.password" value="password" /> 

但这没有实际意义,因为当我指定 EJB 容器以使用被测模块时

Map properties = new HashMap();
properties.put(EJBContainer.MODULES, new File[] { new File("target/classes/") });
ec = EJBContainer.createEJBContainer(properties);

容器只使用主要的 persistence.xml 文件而不是我的测试文件。

尝试 2:将主类和测试类合并到一个分解模块中

我认为使这种方法起作用的唯一方法是使用here 描述的方法 - 将被测模块的类复制到单独的位置(例如目标/ejb-testing-classes),然后复制顶部的测试 persistence.xml 文件,然后将这个新位置指定给 EJB 容器:

Map properties = new HashMap();
properties.put(EJBContainer.MODULES, new File[] { new File("target/ejb-testing-classes/") });
ec = EJBContainer.createEJBContainer(properties);

但这似乎不必要的笨拙。如果我尝试在容器中部署预打包的模块(即依赖项),将来也可能会出现问题,因为我需要在合并之前分解 jar。

我的愿望:EJB 容器的数据源覆盖属性

我认为可能有其他属性可以传递到 EJB 容器中,但到目前为止,我只能找到适合 openEJBwebsphere 的属性。我正在使用嵌入式 Glassfish 来提供我的嵌入式 EJB 容器,因为它是目标平台。 (我现在找到了 glassfish 属性 - 请参阅下面的更新 #1)

肯定每个尝试过使用嵌入式 EJB 容器和不同于生产数据库的数据源来测试 EJB 的人都遇到过这个问题。甚至this guy 也只是在这一点上放弃并使用了默认的嵌入式数据库,这对我来说不是一个选项。

任何帮助将不胜感激。

更新 1:我找到了 Glassfish EJB 容器接受的 list of properties,起初看来我可以使用以下属性

org.glassfish.ejb.embedded.glassfish.configuration.file

在 domain.xml 中定义数据源并将容器指向它。但是,根据source code,除非还设置了installation.root 属性,否则此属性将被忽略——这意味着需要预先安装glassfish 才能运行我的测试。这会不可接受地降低我的 Maven 项目的可移植性。 :(

更新 2:我已经为这个问题创建了一个 JIRA issue,并建议为 glassfish EJB 容器引入属性,它允许配置 JTA 数据源。

【问题讨论】:

  • 花一周时间解决这个问题。非常感谢瑞恩的好描述! =)

标签: jakarta-ee jpa glassfish ejb maven-glassfish-plugin


【解决方案1】:

无法使用嵌入式 Glassfish 完成。

正如我在更新 1 中所指出的,要使用数据源配置嵌入式 EJB 容器,您必须:

  1. 使用新数据源配置 domain.xml 文件
  2. 配置嵌入式 EJB 容器以使用现有 Glassfish AS 安装
  3. 将嵌入式 EJB 容器配置为使用步骤 1 中的 domain.xml 文件。

所以(感谢第 2 步)再见,便携性。但这是我必须采用的“解决方案”,直到 Glassfish 开发人员解决我通过属性配置数据源的请求(请参阅问题中的 JIRA 链接)。

【讨论】:

    【解决方案2】:

    对于我的东西,当不直接使用嵌入式容器但使用 Arquillian 项目时,它工作得很好。当使用 ShrinkWrap 帮助器时,我可以告诉它通过测试 persistence.xml(以及其他替代品)。

    这显示了一个非常简短的示例:https://community.jboss.org/thread/198239

    HTH, 蒂莫

    【讨论】:

    • 谢谢,但我暂时避免使用 Arquillian - 我已经对框架感兴趣了,但也许有一天我会考虑。
    猜你喜欢
    • 2015-07-22
    • 2011-04-25
    • 2011-12-13
    • 2016-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    相关资源
    最近更新 更多