在哪些情况下,我应该使用 Capture 而不是使用 EasyMock 进行单元测试中的对象?
In which cases, I should use Capture rather than an object in Unit Test with EasyMock?
我不确定在进行单元测试时应该在哪些情况下使用 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);
}
提前致谢!
您的理解或多或少是正确的。唯一要补充的是,上面的两个测试都可以用来测试 test_function 但是如果有一个内部 service/function 调用并且我们想要检查值并验证 class 传递给函数的参数类型,然后使用 capture/Argument Captor。
因此,在您的示例中,当您使用 : capture(user) 时,您还需要检查 User 对象的值。
当你想验证一个参数时,你有两种选择。
- 使用匹配器。喜欢
userDao.insertUser(same(user))
- 使用捕获
当测试参数很容易时(如测试身份、相等性等),匹配器将完美运行,应该是首选。
测试参数时更难。例如,您想检查多个属性,捕获将使它变得容易得多。你会做
User user = capturedUser.getValue();
assertEquals("name", user.getName());
assertEquals(16, user.getAge());
我不确定在进行单元测试时应该在哪些情况下使用 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);
}
提前致谢!
您的理解或多或少是正确的。唯一要补充的是,上面的两个测试都可以用来测试 test_function 但是如果有一个内部 service/function 调用并且我们想要检查值并验证 class 传递给函数的参数类型,然后使用 capture/Argument Captor。
因此,在您的示例中,当您使用 : capture(user) 时,您还需要检查 User 对象的值。
当你想验证一个参数时,你有两种选择。
- 使用匹配器。喜欢
userDao.insertUser(same(user))
- 使用捕获
当测试参数很容易时(如测试身份、相等性等),匹配器将完美运行,应该是首选。
测试参数时更难。例如,您想检查多个属性,捕获将使它变得容易得多。你会做
User user = capturedUser.getValue();
assertEquals("name", user.getName());
assertEquals(16, user.getAge());