如何为嵌入式EJB容器定义测试数据源

时间:2013-02-07 10:00:50

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

我正在尝试使用嵌入式EJB容器测试我的EJB。在生产中,我依赖于在应用程序服务器中配置的JTA数据源。但是,在测试期间,我想连接到不同的DB(内存中的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的方法 - 将被测模块的类复制到一个单独的位置(例如target / 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数据源。

2 个答案:

答案 0 :(得分:1)

无法使用嵌入式Glassfish。

正如我在Update 1中所提到的,为了使用数据源配置嵌入式EJB容器,您必须:

  1. 使用新数据源配置domain.xml文件
  2. 配置嵌入式EJB容器以使用现有的Glassfish AS安装
  3. 将嵌入式EJB容器配置为使用步骤1中的domain.xml文件。
  4. 所以(感谢第2步)再见,便携性。但这是我必须使用的“解决方案”,直到Glassfish开发人员通过属性解决我的配置数据源的请求(参见问题上面的JIRA链接)。

答案 1 :(得分:0)

对于我的东西,当不直接使用嵌入式容器但是使用Arquillian项目时,它工作得非常好。使用ShrinkWrap帮助程序时,我可以告诉它传递测试persistence.xml(以及其他替换)。

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

HTH, 蒂莫