我有一個CDI項目,我想用mocks創建單元測試。 要管理嘲笑,我想使用EasyMock並與CDI一起運行,我發現似乎易於使用的cdi-unit項目。單元測試與CDI單元和EasyMock
我有一個問題,在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而是一個實例代理插件tance和EasyMock在這些方法中不接受這種方法(如重置方法)。
所以我代替@ApplicationScoped在MockFactory由@Dependent不proxified實例,但我有一個新的問題:
此註釋在每個注射點給模擬的新實例,這樣我就可以使用它,因爲我在單元測試中模擬了在被測類中調用的模擬方法。而這個模擬實例在被測試的類中必須是相同的(@Dependent並不是這種情況)。
如何在單元測試和測試類中獲得相同的實例?
謝謝。
爲什麼不在測試中創建你的模擬,並使用'new ResultYearMServiceImpl(stockDao)'創建要測試的對象?這是依賴注入的要點:能夠在單元測試中手動注入模擬依賴關係。你不需要CDI來單元測試一個班級。 –
我不使用CDI進行單元測試,我在整個項目中使用CDI。當應用程序運行時,ResultYearMServiceImpl自身被許多類中的CDI注入。所以我需要保持cdi進行單元測試,而不需要將我的構造函數修改爲單元測試需要 – Kiva
您正在使用依賴注入。所以注入你的依賴。您可以使用構造函數,setter或reflaction技巧來訪問注入的字段。如果你的模擬框架不支持這些反射技巧,那麼使用字段注入不是明智的選擇。 Mockito使用其註釋支持現場注射。 –