m_v*_*aly 7 ear junit maven-2 unit-testing ejb
我们正在使用maven构建我们的EAR和EJB项目.它将构建所有EJB项目,然后将它们用作EAR的依赖项,因此它们最终被打包到EAR文件中.
问题是每个EJB项目都有检查EJB的junit测试.目前这些测试不是很有用,因为它们尝试连接到应用程序服务器(jboss)并从EJB接口执行方法.
有没有什么方法可以构建EJB,构建和部署EAR,然后针对应用程序服务器运行所有EJB的所有测试?
现在我在测试中通过初始EJB实现类和手动"注入"注入(someEJBImpl.em = EntityManager ....)来模拟AP,这非常烦人,因为我们之间有很大的依赖关系,我必须处理我自己做的交易.
有没有其他方法可以针对真正的AP运行EJB测试?可以在每个EJB模块之后使用已构建的EJB模块子集部署EAR吗?但是怎么样?
可以设置为运行所有EJB模块的maven测试作为EAR测试的一部分吗?这该怎么做 ?
这不是一个简单的问题,也没有简单的答案.希望这些指针能有所帮助.
我认为您最好的策略是将测试分成真正的单元测试 - 那些可以在没有容器的情况下单独运行的测试,并将需要容器的测试移动到集成测试中.
您可以使用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>
Run Code Online (Sandbox Code Playgroud)
OpenEJB的依赖声明将是:
<dependency>
<groupId>org.apache.openejb</groupId>
<artifactId>openejb-core</artifactId>
<version>3.1</version>
<scope>test</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
您也可以使用Selenium来帮助进行功能测试(假设您已经掌握了这一点),这里有一个使用Selenium,Jetty和OpenEJB的指南.