簡體   English   中英

JMock模擬對象可以返回另一個模擬對象嗎?

[英]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.Daocom.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM