Maven EAR模块和EJB依赖项测试

时间:2009-07-27 03:55:44

标签: unit-testing maven-2 junit ejb ear

我们正在建设我们的EAR&使用maven的EJB项目。它将构建所有EJB项目,然后将它们用作EAR的依赖项,因此最终将它们打包到EAR文件中。

问题是每个EJB项目都有检查EJB的junit测试。目前这些测试不是很有用,因为它们尝试连接到应用程序服务器(jboss)并从EJB接口执行方法。

有什么方法可以构建EJB,构建和部署EAR,然后针对应用程序服务器运行所有EJB的所有测试?

目前我正在通过初始EJB实现类和手动“注入”注入(someEJBImpl.em = EntityManager ....)来模拟测试中的AP,这非常烦人,因为我们之间存在巨大的依赖关系必须自己处理交易。

是否还有其他方法可以针对真实AP运行EJB测试?可以在每个EJB模块之后使用已构建的EJB模块子集部署EAR吗?但是如何?

可以设置为在EAR测试中运行所有EJB模块的maven测试吗?怎么做?

2 个答案:

答案 0 :(得分:7)

这不是一个简单的问题,也没有简单的答案。希望这些指针能有所帮助。

我认为您最好的策略是将测试分成真正的单元测试 - 那些可以在没有容器的情况下单独运行的测试,并将需要容器的测试移到集成测试中。

您可以使用Ejb3unit来最大化不需要运行容器的测试。它有助于模拟一些复杂的依赖项。 Ejb3unit有一个Maven插件,有关连接到Maven存储库的详细信息,请参阅documentation

其他模拟框架(如JMock)也可以提供帮助。如果使用ClassImposteriser,则可以模拟类和接口。

对于那些需要EJB容器的测试,您可以将它们配置为以integration tests运行,将它们移动到单独的项目可能是有意义的,具体取决于EJB项目之间的关系。

可以启动embedded Jetty instance in your JUnit tests并以编程方式向其添加servlet。当然,Jetty不是EJB容器,您需要一个像OpenEJB这样的EJB容器。

要将OpenEJB配置为Jetty,请使用如下配置:

<plugin>
  <groupId>org.mortbay.jetty</groupId>
  <artifactId>maven-jetty-plugin</artifactId>
  <configuration>
    <scanIntervalSeconds>5</scanIntervalSeconds>
    <contextPath>/example</contextPath>
    <systemProperties>
      <systemProperty>
        <name>java.naming.factory.initial</name>
        <value>org.apache.openejb.client.LocalInitialContextFactory</value>
      </systemProperty>
      <systemProperty>
        <name>java.naming.factory.url.pkgs</name>
        <value>org.mortbay.naming</value>
      </systemProperty>
    </systemProperties>
  </configuration>
</plugin>

OpenEJB的依赖声明将是:

<dependency>
  <groupId>org.apache.openejb</groupId>
  <artifactId>openejb-core</artifactId>
  <version>3.1</version>
  <scope>test</scope>
</dependency>

你也可以使用Selenium来帮助进行功能测试(假设你已经做到这一点),这里有一个guide using Selenium, Jetty and OpenEJB

答案 1 :(得分:1)

对于JBoss,您可以尝试Maven Cargo plugin。我目前正在使用JBoss 5.1对其进行测试并仍在使用它:

Where can I find a complete Maven Cargo plugin example for EJB tests?