【问题标题】:what's the "correct" way to write a JUnit test against an EJB?针对 EJB 编写 JUnit 测试的“正确”方法是什么?
【发布时间】:2012-02-27 17:09:01
【问题描述】:

我正在使用 IBM RAD 7(又名 Eclipse 3.4)和 WebSphere 7。

我有一个 EJB 项目,其中包含一个 @Stateless EntityService 和一个 @Stateless EntityDAO 等等。

我有一个 Web 项目,其中包含一个 JAX-RS restful web 服务,它使用这个 JNDI URL 查找 EntityService:

ejblocal:entityEAR/entityEJB.jar/EntityService@com.test.EntityServiceLocal

一切都很好。

我的问题是,编写 JUnit 测试以测试 EntityServiceEntityDAO 类的“正确”方法是什么?

由于系统需要在 WebLogic 服务器中运行才能运行,我想我会让应用程序运行,然后启动 JUnit 测试,它会查找 Web 服务正在使用的相同 JNDI,但我得到了一个错误:

Naming Manager ... getURLContext cannot find the factory for this scheme: ejbLocal

任何建议都很有用,我应该如何编写 JUnit 测试?

【问题讨论】:

    标签: eclipse junit ejb


    【解决方案1】:

    如果您正在编写单元测试,那么它们不应依赖于容器(因为它们仅在 JVM 中执行),因此您无法在其中进行 JNDI 查找。要使用 JUnit 测试您的 EJB Bean 和 DAO,Mocking 框架(如 EasyMock)会很有帮助。

    但是,如果您对测试 EJB 和 REST 服务之间的通信感兴趣,那么您需要集成测试,我怀疑 JUnit 在这方面可以为您提供帮助。 Selenium 是一种流行的集成测试工具,您需要一个功能齐全的容器和环境来执行测试。

    【讨论】:

      【解决方案2】:

      一般来说,JUnit 旨在编写单元测试。在单元测试中,您验证具有单一职责的单个组件的工作(至少它应该具有单一职责:))- 所有依赖项都以某种方式模拟(easymock、mockito 等)。 EJB 中使用的依赖注入简化了这个过程 - 您可以在单元测试 setUp() 方法中使用 new 运算符(您不需要容器)实例化 bean,然后注入模拟依赖项(与容器注入真实依赖项的方式相同)。 这是我使用的方法。另一件事是集成测试,它验证整个场景——从 web 服务(或其他远程外观方法)调用开始,通过 bean 逻辑,直到数据库查询。但是,在这种情况下,您不会验证 Web 服务/外观之后的组件。只是特定输入的 web 服务输出。

      最好的方法是先编写测试(一开始就失败),然后编写实现来满足它。对于单元测试(单个 bean,不在容器内运行的测试),我推荐 JUnit 和 EasyMock/Mockito。对于集成测试,您可以使用 Selenium 或 JUnit+OpenEJB 作为一种简单的测试容器形式(特别是如果您有 EJB 组件形式的远程外观)。此外,使用 SoapUI 等工具,您可以为您的 Web 服务创建完整的测试场景 - 发布一些数据、获取它们、修改、放置、再次获取、删除等等。

      【讨论】:

        【解决方案3】:

        最后,我为要测试的服务类实现了一个@Remote 远程接口,并对服务 bean 进行了远程 JNDI 查找。

        更多细节在这里:

        how to write a JUnit test that can see my EJB service?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-09-13
          • 1970-01-01
          • 2017-05-02
          • 2021-10-28
          • 2019-08-22
          • 2021-12-18
          • 2016-06-24
          • 2021-12-21
          相关资源
          最近更新 更多