我不确定在进行单元测试时我应该在哪些情况下使用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);
}
}
在这种情况下我应该使用Capture:因为用户对象是在register()方法中创建的,而且它是userDao.insertUser(user)的参数。那么,我需要使用Capture吗?
这是否意味着:当我想测试testTargetClass.testTargetMethod()时。如果 testTargetMethod()中有另一个服务调用,它的参数是在testTargetMethod()中创建的,我应该使用Capture作为参数吗?
我可以使用下面的代码进行测试吗?
public void testRegister {
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);
}
提前致谢!
答案 0 :(得分:0)
您的理解或多或少是正确的。唯一要添加的是上述两个测试都可以用来测试test_function,但是如果有内部服务/函数调用,我们想要检查值并验证传递给函数的参数的类类型,然后使用capture / Argument Captor。
因此,在您的示例中,当您使用:capture(user)时,您还需要检查User对象的值。
答案 1 :(得分:0)
如果要验证参数,可以有两种选择。
userDao.insertUser(same(user))
当测试参数很容易时(比如测试身份,等式等),匹配器将完美地工作,应该是首选。
测试参数时更难。例如,您想检查多个属性,捕获将使其更容易。你会做的
User user = capturedUser.getValue();
assertEquals("name", user.getName());
assertEquals(16, user.getAge());