我正在使用 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
marker接口。哦。