gpt4 book ai didi

java - JMock 模拟对象可以返回另一个模拟对象吗?

转载 作者:行者123 更新时间:2023-12-01 05:56:48 28 4
gpt4 key购买 nike

我正在使用 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标记接口(interface)。哦。

最佳答案

删除 mockDao 上的 .proxy() 调用。您希望 getDao() 返回 mockDao 而不是代理。

另外,看来你使用的是JMock 1。我建议你迁移到具有更好API的JMock(或者甚至迁移到协议(protocol)更简单的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了解更多详情。

关于java - JMock 模拟对象可以返回另一个模拟对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2668009/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com