我有一个使用 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 。
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/