我正在尝试使用
@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()
时,它正在检查更新的值。这实际上是有道理的,因为我捕获的是对象而不是对象的状态。
但是,如何验证对象在传递时的状态?
我认为这是不可能的。即使在查看最新版本的 ArgumentCaptor 时(此时为 mockito 2.7.21);根本没有迹象表明要朝这个方向发展。
ArgumentCaptor 提供的服务的目的是收集调用方法时使用的那些参数。
您基本上要问的是:有没有办法在呼叫发生时进行额外的检查。
我想,这是可能的:框架必须允许您注册一个回调,每当在模拟对象上调用特定方法时都会调用该回调。但这在今天是不可能的。
我看到的唯一解决方案 - 而不是做
@Mock
YourRealDaoClass theMockedDao
你必须做
class MockedDaoClass extends YourRealDaoClass {
然后自己实现这些事情。这样您就可以放置:
YourRealDaoClass theMockedDao = new MockedDaoClass(...
进入您的测试。连同一些其他逻辑来启用您需要的东西。
换句话说:Mockito生成的模拟不允许你在模拟对象上调用方法时进行增强测试。如果你需要它(例如做一个测试,比如:param.getFoo().equals()
),那么你又回到了创建自己的存根/模拟类。
你必须做什么:
- 仔细检查 Dao 类的所有方法
- 确定您需要覆盖哪一个,以确保它们返回使模拟与您的生产代码一起工作所需的值
- 对于接收您感兴趣的参数的方法:要么在那里进行检查;要么收集值以供以后检查