是否可以在 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/