Java 如果传递的参数';美国的状态改变了吗?
我正在尝试使用Java 如果传递的参数';美国的状态改变了吗?,java,unit-testing,mockito,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
@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.
*/
在断言userArgumentCaptor.getValue()
时,它正在检查更新的值。这实际上是有道理的,因为我捕获的是对象,而不是对象的状态
但是,当传递对象时,如何验证对象的状态?我认为这是不可能的。即使是在查看最新版本(此时为mockito 2.7.21)时;没有任何迹象表明会朝这个方向发展 ArgumentCaptor提供的服务的目的是收集调用方法时使用的参数 你要问的基本上是:有没有办法在呼叫发生时进行额外的检查 我想,这是可能的:框架必须允许您注册回调,只要在模拟对象上调用特定方法,就会调用回调。但这在今天是不可能的 我看到的唯一解决办法是——而不是做
@Mock
YourRealDaoClass theMockedDao
你必须这么做
class MockedDaoClass extends YourRealDaoClass {
然后自己实施这些事情。因此,您可以:
YourRealDaoClass theMockedDao = new MockedDaoClass(...
进入你的测试。再加上一些其他的逻辑来实现你需要的东西
换句话说:Mockito生成的mock不允许您在对模拟对象调用方法时进行增强测试。如果您需要它(例如执行类似于:param.getFoo().equals()
)的测试),那么您可以重新创建自己的存根/模拟类
你必须做的是:
- 仔细检查Dao类拥有的所有方法
- 决定需要覆盖哪一个,以确保它们返回使模拟与生产代码一起工作所需的值
- 对于接收您感兴趣的参数的方法:要么立即进行检查;或者收集这些值以供以后检查
MockedDaoClass
我不会更改该类中参数的状态。我在外部更改。这正在反映出来。似乎我应该澄清这个问题。抱歉。听起来你实习的一个重要部分是向该团队解释“不时雇佣实习生来做单元测试”在现实中不起作用。如果您不编写可测试的生产代码……令人惊讶的是:测试变得很难。也许您应该与这些人共享此链接。
YourRealDaoClass theMockedDao = new MockedDaoClass(...