1

我正在使用 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.SqlMapDaoTemplateClassCastException

我错过了什么?

更新:将代码转换为使用 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.Daomarker接口。哦。

4

1 回答 1

0

删除.proxy()通话mockDao。您想getDao()返回mockDao而不是代理。

此外,您似乎正在使用 JMock 1。我建议您移动具有更好 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 。

于 2010-04-19T14:16:58.007 回答