unit-testing - 使用 CDI Unit 和 EasyMock 进行单元测试

标签 unit-testing cdi easymock cdi-unit

我有一个使用 CDI 的项目,我想用模拟创建单元测试。 为了管理模拟,我想使​​用 EasyMock 并使用 CDI 运行,我发现 cdi-unit 项目似乎很容易使用。

我在 CDI 上下文中使用 EasyMock 进行模拟时遇到问题。这是我的单元测试:

@RunWith(CdiRunner.class)
@AdditionalClasses(MockFactory.class)
public class ResultYearMServiceImplTest {

    @Inject
    private IStockDao stockDao;

    @Inject
    private ResultYearMServiceImpl resultYearMService;

    @Test
    public void getResultList() {
        EasyMock.reset(stockDao);
        EasyMock.expect(stockDao.getListStocks()).andReturn(null).once()
                .andReturn(new ArrayList<DtoStock>()).once();
        EasyMock.replay(stockDao);
    }
}

IStockDao 需要在测试中被模拟,所以为了得到它我想使用这样的@Produces 方法(在@AdditionalClasses 给cdi 单元的MockFactory 类中):

@Produces
@ApplicationScoped
public IStockDao getStockDao() {
    return EasyMock.createMock(IStockDao.class);
}

当我运行我的单元测试时,模拟在单元测试中是好的,但我得到这个错误:

java.lang.IllegalArgumentException: Not a mock: org.jboss.weld.proxies.IStockDao$-1971870620$Proxy$_$$_WeldClientProxy

这是因为 CDI 没有提供 EasyMock IStockDao 的实例,而是一个代理实例,EasyMock 在这些方法(如重置方法)中不接受它。

所以我用 @Dependent 替换了 MockFactory 中的 @ApplicationScoped,它没有代理实例,但我有一个新问题:

此注释在每个注入(inject)点都提供了一个新的模拟实例,因此我可以使用它,因为我在单元测试中有一个模拟来模拟在测试类中调用的方法。并且这个 mock 实例在被测类中必须是相同的(@Dependent 不是这样)。

如何在单元测试和测试类中获取相同的实例?

谢谢。

最佳答案

Needle 是您测试 CDI 的好 friend 。

http://needle.spree.de

public class ResultYearMServiceImplTest {
   @Rule
   public final NeedleRule needle = new NeedleRule();

   @Inject
   private IStockDao stockDao;

   @ObjectUnderTest
   private ResultYearMServiceImpl resultYearMService;
@Test
public void getResultList() {
    EasyMock.reset(stockDao);
    EasyMock.expect(stockDao.getListStocks()).andReturn(null).once()
            .andReturn(new ArrayList<DtoStock>()).once();
    EasyMock.replay(stockDao);
}
}

关于unit-testing - 使用 CDI Unit 和 EasyMock 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16761905/

相关文章:

python - Python代码的代码覆盖率和单元测试

python - 一次运行多个 unittest 测试文件

java - 观察多个 CDI 事件?

java - EasyMock:replay后多加一个期望

java - JUnit 测试中的注释数量不正确

unit-testing - 是否可以在不打开类(class)的情况下将 Mockito 与 Kotlin 一起使用?

java - EJB @DependsOn 和 CDI 实例不工作

jakarta-ee - JAX-RS 中未发生 @Resource 注入(inject)

java - Easymock:匹配器调用的使用超出预期

java - EasyMock 在设置属性时拦截