7

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

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

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

现在我正在通过启动 EJB-Implementation 类和手动“注入”注入(someEJBImpl.em = EntityManager ....)在测试中模拟 AP,这很烦人,因为我们在它们之间有很大的依赖关系,我必须处理本人交易。

有没有其他方法可以针对真正的 AP 运行 EJB 测试?是否可以在每个 EJB 模块之后部署 EAR,其中包含已构建的 EJB 模块子集?但是如何?

是否可以设置为运行所有 EJB 模块的 maven 测试作为 EAR 测试的一部分?这该怎么做 ?

4

2 回答 2

7

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

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

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

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

对于那些确实需要 EJB 容器的测试,您可以将它们配置为作为集成测试运行,根据您的 EJB 项目之间的关系,将它们移动到单独的项目中可能是有意义的。

可以在 JUnit 测试中启动嵌入式 Jetty 实例并以编程方式向其中添加 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来帮助进行功能测试(假设您已经做到了这一点),这里有一个使用 Selenium、Jetty 和 OpenEJB 的指南

于 2009-07-27T05:15:53.713 回答
1

对于 JBoss,您可以尝试Maven Cargo 插件。我目前正在使用 JBoss 5.1 对其进行测试,并且仍在努力:

在哪里可以找到用于 EJB 测试的完整 Maven Cargo 插件示例?

于 2009-11-14T09:22:55.183 回答