在哪些情况下,我应该使用Capture而不是使用EasyMock进行单元测试中的对象?

时间:2017-12-27 06:01:22

标签: java unit-testing junit capture 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);
    

    }

  4. 提前致谢!

2 个答案:

答案 0 :(得分:0)

您的理解或多或少是正确的。唯一要添加的是上述两个测试都可以用来测试test_function,但是如果有内部服务/函数调用,我们想要检查值并验证传递给函数的参数的类类型,然后使用capture / Argument Captor。

因此,在您的示例中,当您使用:capture(user)时,您还需要检查User对象的值。

答案 1 :(得分:0)

如果要验证参数,可以有两种选择。

  1. 使用匹配器。与userDao.insertUser(same(user))
  2. 一样
  3. 使用捕获
  4. 当测试参数很容易时(比如测试身份,等式等),匹配器将完美地工作,应该是首选。

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

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