如果参数的状态发生变化,如何验证传递的参数是否具有正确的参数?

时间:2017-04-07 09:03:44

标签: java unit-testing mockito

我正在尝试使用

验证对象
@Captor
ArgumentCaptor<User> userArgumentCaptor
...//define user with name and jailName - var = user1
...//Call the method under test.
verify(userDao).getName(userArgumentCaptor.capture());
verify(userDai).getJailName(userArgumentCaptor.capture());
assertThat(userArgumentCaptor.getAllValues()).isEqualTo(Arrays.asList(user1user1));
/**
* Notice here that I had to use same object to verify even when I captured it in two different situations.
*/

表示方案,

User user = new User(); //Object under inspection.
user.setId(); //Changing state here.
userDao.getName(user); //Capture user here.
...
if(someBooleanCondition) {
    user.setJailStatus(true); //Changing state here.
    userDao.getJailName(user); //Capture user here.
}

在声明userArgumentCaptor.getValue()时,它正在检查更新的值。这实际上是有意义的,因为我捕获的对象不是对象的状态。

但是,如何验证对象在传递时的状态?

1 个答案:

答案 0 :(得分:1)

我认为这是不可能的。即使在查看ArgumentCaptor的最新版本时(此时为mockito 2.7.21);根本没有迹象表明朝那个方向前进。

ArgumentCaptor提供的目的和服务分别是收集调用方法时使用的参数。

你问的基本上是:有没有办法在电话发生时进行额外的检查。

我想,它可能成为可能:框架必须允许您注册一个回调,只要在模拟对象上调用特定方法就会调用该回调。但是今天这是不可能的。

我看到的唯一解决方案 - 而不是

@Mock
YourRealDaoClass theMockedDao

你必须这样做

class MockedDaoClass extends YourRealDaoClass {

然后实施自己这样的事情。所以你可以把:

YourRealDaoClass theMockedDao = new MockedDaoClass(...

进入你的测试。与其他一些逻辑一起启用您需要的东西。

换句话说:Mockito生成的模拟不允许您在模拟对象上调用方法时进行增强测试。如果您需要(例如进行类似:param.getFoo().equals()的测试),那么您将重新创建自己的存根/模拟类。

你需要做什么:

  • 仔细检查Dao类具有的所有方法
  • 决定您需要覆盖哪一个,以确保它们返回使模拟与您的生产代码一起使用所需的值
  • 获取您感兴趣的参数的方法:要么在那里检查;或收集值以便日后检查