在哪些情况下,我应该使用 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);
    }
}
  1. 在这种情况下我应该使用Capture吗:因为用户对象是在register()方法内部创建的,它是userDao.insertUser(user)的参数。那么,我需要使用 Capture 吗?

  2. 是指:当我要测试testTargetClass.testTargetMethod()时。如果 在 testTargetMethod() 中还有另一个服务调用,它的参数是在 testTargetMethod() 中创建的,我应该使用 Capture 作为参数吗?

  3. 我可以用下面的代码来测试吗?

    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 对象的值。

当你想验证一个参数时,你有两种选择。

  1. 使用匹配器。喜欢userDao.insertUser(same(user))
  2. 使用捕获

当测试参数很容易时(如测试身份、相等性等),匹配器将完美运行,应该是首选。

测试参数时更难。例如,您想检查多个属性,捕获将使它变得容易得多。你会做

User user = capturedUser.getValue();
assertEquals("name", user.getName());
assertEquals(16, user.getAge());