我正在使用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
标记界面。 D'哦。
答案 0 :(得分: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。