java - 如何使用 Arquillian 模拟服务?

标签 java jakarta-ee mocking ejb jboss-arquillian

是否可以在 Arquillian 中使用某种模拟框架,或者确切地说如何模拟注入(inject)的 EJB?我知道,通过使用 CDI(上下文和依赖注入(inject)),可以在测试中注入(inject)替代方案。但是如果没有 CDI 作为注入(inject)机制,当我只使用 EJB 注入(inject)时,这怎么可能?

最近我用服务接口(interface)模拟实现测试了我的 EJB,如下所示:

// Service inteface 
public interface Audit {
   void audit(String info);
}

// Mock implementation
@Stateless
public class MockAuditBean implements Audit {

    public static String lastInfo = null;

    @Override
    public void audit(String info) {
        this.lastInfo = info;
    }
}

// assert in test
assertTrue(MockAuditBean.lastInfo.contains("dummy"));

这种方法是可行的,但需要大量自定义模拟实现。更糟糕的是,注入(inject)的模拟实例是代理并使用服务接口(interface)。这些不能转换为模拟实现类来比较结果。只能使用模拟实现的静态成员和方法。

我还测试了另一种手动设置相关 EJB 的可能性。这种方法有几个缺点。它要求测试的目标 EJB 具有非私有(private)成员或它们的 setter 。当目标 EJB 依赖于@PostConstruct 生命周期注释时,您必须在手动“注入(inject)”设置后调用它。 该解决方案的优势在于能够使用模拟框架,例如 mockito 或 jMock。

有没有人分享经验,如何测试和设置这样的集成测试,甚至在其中使用模拟框架?

最佳答案

IMO,EJB 在设计时并未考虑测试。您的替代方案听起来是一个足够好的折衷方案,我会选择它。使用 mockito 是一大优势,我什至在使用 CDI 时也使用它。

我将使用“默认”成员作用域和 javadoc 来让其他开发人员仅出于测试目的访问它们。

关于java - 如何使用 Arquillian 模拟服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5147344/

相关文章:

java - java类崩溃中的startActivity

java - 错误的 SQLite 错误?代码14

java - 在 ejb 中使用 spring

java - 从 POJO 调用基于 Spring 的 Web 应用程序类

c++ - 是否有允许模拟 std::ifstream 和其他 I/O 库的模拟框架?

c# - 如何在 Moq 中模拟链式 Linq 方法

java - 尝试运行客户端时出现 EJB 异常

java - JBoss 安全问题

jakarta-ee - JBoss AS 7.1 - 使用 @Schedule 注释运行计划

node.js - 模拟文件系统内容不适用于 gulp.src