Fir*_*maX 30 java testing junit unit-testing easymock
我正在尝试使用EasyMock来模拟一些数据库接口,以便我可以通过包装方法测试业务逻辑.我已经通过在我的测试设置中使用以下方法返回的方法.
DBMapper dbmapper = EasyMock.createMock(DBMapper.class);
userService.setDBMapper(dbmapper);
Run Code Online (Sandbox Code Playgroud)
然后在我的实际测试中运行
EasyMock.expect(dbmapper.getUser(userId1)).andReturn(mockUser1);
EasyMock.replay(dbmapper);
userService.getUser(userId1);
Run Code Online (Sandbox Code Playgroud)
然后,此服务连接到dbmapper并返回对象(使用setter方法注入映射器)
这些类型的模拟似乎工作正常.但是,当我尝试运行测试时
userService.addUser(newUser1);
Run Code Online (Sandbox Code Playgroud)
此方法调用void方法.
dbmapper.createUser(newUser);
Run Code Online (Sandbox Code Playgroud)
我正在嘲笑这个方法.我尝试了以下内容
EasyMock.expectLastCall();
EasyMock.replay(dbMapper);
userService.addUser(newUser1);
Run Code Online (Sandbox Code Playgroud)
正如其他一些帖子/问题等似乎暗示我得到了一个 IlligalStateException: no last call on a mock available
有人能指出我正确的方向吗?
提前谢谢了
Dan*_*ple 34
你很亲密
您只需要在调用之前在模拟上调用该方法 expectLastCall()
所以你期望看起来像这样:
userService.addUser(newUser1);
EasyMock.expectLastCall();
EasyMock.replay(dbMapper);
userService.addUser(newUser1);
Run Code Online (Sandbox Code Playgroud)
这是因为模拟对象在调用之前处于记录模式replay()
,因此对它的任何调用都将执行默认行为(返回null /什么都不做),并且在replay()
调用方法时将有资格进行重放.
我喜欢做的是确保方法调用显然是期望的是在它前面放一个小注释,如下所示:
/* expect */ userService.addUser(newUser1);
EasyMock.expectLastCall();
EasyMock.replay(dbMapper);
userService.addUser(newUser1);
Run Code Online (Sandbox Code Playgroud)
小智 13
如果您使用'nice'API,则不会发生此问题:
DBMapper dbmapper = EasyMock.createNiceMock(DBMapper.class);
Run Code Online (Sandbox Code Playgroud)
有两种模拟 - 严格和好.如果调用了意外的方法,则strict mock会抛出Assertion Error.漂亮的模拟允许在模拟上进行意外的方法调用.
有关更多详细信息,请参阅官方文档 - http://easymock.org/user-guide.html#mocking-strict
归档时间: |
|
查看次数: |
56771 次 |
最近记录: |