2009-07-27 84 views
7

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

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

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

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

是否有任何其他方式对真实AP运行EJB测试?可以在每个EJB模块和已经构建的EJB模块的子集之后部署EAR?但是如何?

可以设置为运行所有EJB模块的Maven测试作为EAR测试的一部分吗?这个怎么做 ?

回答

7

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

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

您可以使用Ejb3unit最大化不需要容器运行的测试。它有助于嘲弄一些复杂的依赖关系。 Ejb3unit有一个Maven插件,请参阅documentation了解连接到他们的Maven仓库的详细信息。

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

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

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

配置OpenEJB的进入码头,使用这样的配置:

<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这样做。