我正在尝试使用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方法注入映射器)
这些类型的mock似乎工作得很好。但是,当我尝试运行
userService.addUser(newUser1);
此方法调用void方法。
dbmapper.createUser(newUser);
这就是我在模拟时遇到问题的方法。我尝试过以下几种方法
EasyMock.expectLastCall();
EasyMock.replay(dbMapper);
userService.addUser(newUser1);
因为其他一些帖子/问题等似乎建议我得到一个IlligalStateException: no last call on a mock available
有谁能告诉我怎么走吗?
非常感谢你提前
发布于 2014-04-03 21:28:52
你已经很接近了。
在调用expectLastCall()
之前,您只需要在模拟上调用该方法
因此,您的期望将如下所示:
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);
发布于 2015-08-28 08:56:23
如果你使用'nice‘API,这个问题就不会发生:
DBMapper dbmapper = EasyMock.createNiceMock(DBMapper.class);
有两种模拟--严格的和很好的。如果调用了意想不到的方法,严格模拟将抛出断言错误。这个不错的mock允许在mock上进行意外的方法调用。
有关详细信息,请参阅官方文档- http://easymock.org/user-guide.html#mocking-strict
https://stackoverflow.com/questions/22831523
复制相似问题