如何使用Arquillian模拟服务?

Tel*_*tko 15 java ejb mocking java-ee jboss-arquillian

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

最近我用服务接口模拟实现测试了我的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"));
Run Code Online (Sandbox Code Playgroud)

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

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

是否有人分享经验,如何测试和设置此类集成测试,甚至使用模拟框架?

小智 3

IMO,EJB 的设计并没有考虑到测试。你的替代方案听起来是一个足够好的妥协方案,我会选择它。使用mockito 是一个主要优点,即使在使用CDI 时我也会使用它。

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