繁体   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