易上空洞法

2022-09-01 11:44:59

我正在尝试使用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()

所以你的期望会看起来像这样:

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

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

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

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

答案 2

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

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

有两种模拟 - 严格和漂亮。严格模拟会引发断言错误,以防调用意外的方法。nice mock 允许在 mock 上调用意外的方法。

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


推荐