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

问题描述 投票:0回答:2

我不确定在进行单元测试时我应该在哪些情况下使用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:因为user(对象)是在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); }

提前致谢!

java unit-testing junit capture easymock
2个回答
0
投票

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

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

当测试参数很容易(比如测试身份,相等等)时,匹配器将完美地工作并且应该是首选。

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

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

0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.