首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >EasyMock void方法

EasyMock void方法
EN

Stack Overflow用户
提问于 2014-04-03 16:10:25
回答 2查看 67.9K关注 0票数 30

我正在尝试使用EasyMock模拟一些数据库接口,这样我就可以测试包装方法中的业务逻辑。通过在我的测试设置中使用以下代码,我一直可以使用返回的方法。

代码语言:javascript
运行
复制
DBMapper dbmapper = EasyMock.createMock(DBMapper.class);
userService.setDBMapper(dbmapper);        

然后在我的实际测试中运行

代码语言:javascript
运行
复制
EasyMock.expect(dbmapper.getUser(userId1)).andReturn(mockUser1);
EasyMock.replay(dbmapper);
userService.getUser(userId1);

然后,该服务连接到dbmapper并返回对象(使用setter方法注入映射器)

这些类型的mock似乎工作得很好。但是,当我尝试运行

代码语言:javascript
运行
复制
userService.addUser(newUser1);

此方法调用void方法。

代码语言:javascript
运行
复制
dbmapper.createUser(newUser);

这就是我在模拟时遇到问题的方法。我尝试过以下几种方法

代码语言:javascript
运行
复制
EasyMock.expectLastCall();
EasyMock.replay(dbMapper);
userService.addUser(newUser1);

因为其他一些帖子/问题等似乎建议我得到一个IlligalStateException: no last call on a mock available

有谁能告诉我怎么走吗?

非常感谢你提前

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-03 21:28:52

你已经很接近了。

在调用expectLastCall()之前,您只需要在模拟上调用该方法

因此,您的期望将如下所示:

代码语言:javascript
运行
复制
userService.addUser(newUser1);
EasyMock.expectLastCall();
EasyMock.replay(dbMapper);
userService.addUser(newUser1);

这之所以有效,是因为模拟对象在调用replay()之前处于记录模式,因此对它的任何调用都将执行默认行为(返回null/不执行任何操作),并且在调用replay()方法时有资格重放。

我喜欢做的是确保方法调用显然是为了一个期望,就是在它前面放一个小注释,像这样:

代码语言:javascript
运行
复制
/* expect */ userService.addUser(newUser1);
EasyMock.expectLastCall();
EasyMock.replay(dbMapper);
userService.addUser(newUser1);
票数 37
EN

Stack Overflow用户

发布于 2015-08-28 08:56:23

如果你使用'nice‘API,这个问题就不会发生:

代码语言:javascript
运行
复制
DBMapper dbmapper = EasyMock.createNiceMock(DBMapper.class);

有两种模拟--严格的和很好的。如果调用了意想不到的方法,严格模拟将抛出断言错误。这个不错的mock允许在mock上进行意外的方法调用。

有关详细信息,请参阅官方文档- http://easymock.org/user-guide.html#mocking-strict

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22831523

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档