[英]Can a JMock mock object return another mock object?
我正在使用iBatis DAO框架為應用程序編寫測試。 該應用程序在Java 1.4環境中運行,因此我正在使用所有版本的舊版本(JDK 1.4,JUnit3,iBatis 2.3和JMock 1.2)。
在我的MockObjectTestCase
子類中,我有此測試
public void testInsert() throws Exception {
Mock mockDao = mock(TblPpvFiltersDao.class);
mockDao.expects(once()).method("insert");
Mock mockDaoManager = mock(DaoManager.class);
mockDaoManager.expects(once()).method("getDao")
.with(eq(TblPpvFiltersDao.class))
.will(returnValue((TblPpvFiltersDao) mockDao.proxy()));
PpvFiltersService service = new PpvFiltersServiceImpl(
(DaoManager) mockDaoManager.proxy());
service.insert(new PpvFiltersVO());
}
它將驗證服務對象將向DaoManager
詢問DAO對象並在其上調用insert
方法。 測試失敗並顯示錯誤消息
...DynamicMockError: mockDaoManager: tried to return an incompatible value:
expected a com.ibatis.dao.client.Dao but returned a $Proxy0
嘗試將mockDao
對象轉換為com.ibatis.dao.client.Dao
或com.ibatis.dao.client.template.SqlMapDaoTemplate
都以ClassCastException
結尾。
我想念什么?
更新:將代碼轉換為使用JDK 1.6,JUnit 4和JMock2並沒有改變。 這段代碼
@Test
public void testInsert() throws Exception {
final PpvFiltersVO theFilter = new PpvFiltersVO(new Integer(42));
final TblPpvFiltersDao mockDao = context.mock(TblPpvFiltersDao.class);
final DaoManager mockDaoManager = context.mock(DaoManager.class);
context.checking(new Expectations() {{
oneOf (mockDaoManager).getDao(TblPpvFiltersDao.class);
will(returnValue(mockDao));
oneOf (mockDao).insert(theFilter);
}});
PpvFiltersService service = new PpvFiltersServiceImpl(mockDaoManager);
service.insert(theFilter);
}
導致此錯誤消息:
java.lang.IllegalStateException: tried to return a $Proxy6 from a method
that can only return a com.ibatis.dao.client.Dao
也許我在這里缺少明顯的東西,但是上面的代碼幾乎直接來自http://www.jmock.org/getting-started.html上的JMock示例。
有任何想法嗎?
固定當然,這很明顯。 上面的TblPpvFiltersDao
需要擴展com.ibatis.dao.client.Dao
標記接口。 天啊
卸下.proxy()
的調用mockDao
。 您希望getDao()
返回mockDao
而不是代理。
另外,似乎您正在使用JMock1。我建議您將具有更好API的JMock(甚至移至協議更簡單的Mockito )。 在JMock2中,您創建一個上下文對象(Mockery實例),從中創建模擬對象,該對象是類的實際實例(而不僅僅是Mock類型的實例)。
Mockery ctx = new Mockery();
TblPpvFiltersDao dao = ctx.mock(TblPpvFiltersDao.class);
DaoManager daoManager = ctx.mock(DaoManager.class);
...
有關更多詳細信息,請參見http://www.jmock.org/getting-started.html 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.