EasyMock 作废方法

Posted

技术标签:

【中文标题】EasyMock 作废方法【英文标题】:EasyMock void method 【发布时间】:2014-05-14 22:06:15 【问题描述】:

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

DBMapper dbmapper = EasyMock.createMock(DBMapper.class);
userService.setDBMapper(dbmapper);        

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

EasyMock.expect(dbmapper.getUser(userId1)).andReturn(mockUser1);
EasyMock.replay(dbmapper);
userService.getUser(userId1);

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

这些类型的模拟似乎工作正常。但是,当我尝试为

运行测试时
userService.addUser(newUser1);

此方法调用 void 方法。

dbmapper.createUser(newUser);

这是我在模拟时遇到问题的方法。 我已经尝试了以下

EasyMock.expectLastCall();
EasyMock.replay(dbMapper);
userService.addUser(newUser1);

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

谁能指出我正确的方向?

提前致谢

【问题讨论】:

【参考方案1】:

你已经接近了。

你只需要在调用expectLastCall()之前调用你的mock上的方法

所以你的期望是这样的:

userService.addUser(newUser1);
EasyMock.expectLastCall();
EasyMock.replay(dbMapper);
userService.addUser(newUser1);

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

我喜欢做的是确保方法调用很明显是为了一个期望是在它前面放一个小注释,如下所示:

/* expect */ userService.addUser(newUser1);
EasyMock.expectLastCall();
EasyMock.replay(dbMapper);
userService.addUser(newUser1);

【讨论】:

其实expectLastCall对于void方法是不需要的。因此,除非createUser 是最终的,否则以下代码将起作用: DBMapper dbmapper = EasyMock.createMock(DBMapper.class);期望(dbmapper.getUser(userId1)).andReturn(mockUser1); dbmapper.createUser(newUser);重播(dbmapper); userService.addUser(newUser1); @Henri 非常正确。为了完整起见,我把它留了下来。【参考方案2】:

如果您使用 'nice' API,则不会发生此问题:

DBMapper dbmapper = EasyMock.createNiceMock(DBMapper.class);

有两种 mock - strict 和 nice。如果调用了意外的方法,严格的模拟会抛出断言错误。 nice mock 允许对 mock 进行意外的方法调用。

更多详情请参考官方文档-http://easymock.org/user-guide.html#mocking-strict

【讨论】:

以上是关于EasyMock 作废方法的主要内容,如果未能解决你的问题,请参考以下文章

测试没有使用 EasyMock 调用 void 方法

easymock笔记2

EasyMock:无效方法

EasyMock 为预期方法返回 Null

使用easymock,重复void方法调用

EasyMock简单使用方法