我正在使用IBM RAD 7(又名Eclipse 3.4)和WebSphere 7。
我有一个包含@Stateless EntityService
和@Stateless EntityDAO
等项目的EJB项目。
我有一个Web项目,其中包含一个JAX-RS restful Web服务,该服务使用此JNDI URL查找EntityService:
ejblocal:entityEAR/entityEJB.jar/EntityService@com.test.EntityServiceLocal
一切都很好。
我的问题是,编写 JUnit 测试以测试EntityService
和EntityDAO
类的“正确”方法是什么?
由于系统需要在WebLogic服务器中运行才能运行,我想我会让应用程序运行,然后启动JUnit测试,查看与Web服务正在使用的相同的JNDI,但是我得到了错误:
Naming Manager ... getURLContext cannot find the factory for this scheme: ejbLocal
任何建议都很有用,我应该如何编写JUnit测试?
答案 0 :(得分:2)
如果您正在编写单元测试,那么它们不应该依赖于容器(因为它们仅在JVM中执行),因此您无法在其中执行JNDI查找。要使用JUnit测试EJB Bean和DAO,Mocking Framework(如EasyMock)可以提供很大的帮助。
但是,如果您对测试EJB和REST服务之间的通信感兴趣,那么您需要集成测试,我怀疑JUnit可以在这里为您提供帮助。集成测试的一个流行工具是Selenium,您需要一个功能齐全的容器和环境来执行测试。
答案 1 :(得分:1)
通常,JUnit旨在编写单元测试。在单元测试中,您验证具有单一责任的单个组件的工作(至少它应该具有单一责任:)) - 所有依赖项都以某种方式被模拟(easymock,mockito等)。
EJB中使用的依赖注入简化了这个过程 - 您可以使用setUp()
运算符(您不需要容器)在单元测试new
方法中实例化bean,然后注入模拟的依赖项(与容器注入的方式相同)真正的依赖)。
这是我使用的方法。另一件事是集成测试,它验证整个场景 - 从webservice(或其他远程外观方法)调用开始,通过bean逻辑,直到数据库查询。但是,在这种情况下,您不会验证站在webservice / facade之后的组件。只是特定输入的webservice输出。
好的方法是首先编写测试(在开始时失败),然后编写实现以满足它。对于单元测试(单个bean,测试不在容器内运行)我建议使用JUnit和EasyMock / Mockito。对于集成测试,您可以使用Selenium或JUnit + OpenEJB作为测试的简单容器形式(特别是如果您具有EJB组件形式的远程外观)。此外,使用SoapUI等工具,您可以为您的Web服务创建完整的测试场景 - 发布一些数据,获取,修改,放置,获取,删除等等。
答案 2 :(得分:0)
在一天结束时,我为我想要测试的Service类实现了一个@Remote远程接口,并对服务bean进行了远程JNDI查找。
此处有更多详情: