我不确定在进行单元测试时我应该在哪些情况下使用EasyMock Capture。我在网站上看过一些资料,但我不确定我的理解是否正确。
以下代码为例:
public class UserService {
private UserDao userDao;
public boolean register() {
User user = new User();
user.type = "VIP";
return userDao.insertUser(user);
}
}
public class UserServiceTest {
public void testRegister {
UserDao userDao = createMock(UserDao.class);
Capture<User> captureUser = new Capture<>();
expect(userDao.insertUser(capture(captureUser)))
.andReturn(true);
replay(userDao);
userService.setUserDao(userDao);
userService.register();
verify(userDao);
}
}
UserDao userDao = createMock(UserDao.class);
User mockUser = new User();
mockUser.setType = "VIP";
expect(userDao.insertUser(mockUser)).andReturn(true);
replay(userDao);
userService.setUserDao(userDao);
userService.register();
verify(userDao);
}提前致谢!
如果要验证参数,可以选择两种方法。
userDao.insertUser(same(user))
当测试参数很容易(比如测试身份,相等等)时,匹配器将完美地工作并且应该是首选。
测试参数时更难。例如,您想检查多个属性,捕获将使其更容易。你会去做的
User user = capturedUser.getValue();
assertEquals("name", user.getName());
assertEquals(16, user.getAge());
您的理解或多或少是正确的。唯一要添加的是上述两个测试都可以用来测试test_function,但是如果有内部服务/函数调用,我们想要检查值并验证传递给函数的参数的类类型,然后使用capture / Argument Captor。
因此,在您的示例中,当您使用:capture(user)时,您还需要检查User对象的值。