这不是一个简单的问题,也没有简单的答案。希望这些指示会有所帮助。
我认为你最好的策略是将你的测试分成真正的单元测试——那些可以在没有容器的情况下独立运行的测试,并将需要容器的测试移动到集成测试中。
您可以使用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 的指南。