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类拥有的所有方法
  • 决定需要覆盖哪一个,以确保它们返回使模拟与生产代码一起工作所需的值
  • 对于接收您感兴趣的参数的方法:要么立即进行检查;或者收集这些值以供以后检查

您能提供您的测试代码吗?这会让你更容易得到帮助。当然。我也是。这就是为什么我不断添加这些;-)。。。只是为了确保乐趣的到来。。。在这里做评论聊天的时候,它经常丢失-(等等,你能详细介绍一下扩展和实现吗?我增强了我的答案。但问题是:这更多的是一个理论上的答案。我自己还没有写存根/模拟类。希望这足以让你继续。如果没有,请给我一个评论……我正在尝试看看它是否对我有效以及如何做到。问题是,即使我实现了t
MockedDaoClass
我不会更改该类中参数的状态。我在外部更改。这正在反映出来。似乎我应该澄清这个问题。抱歉。听起来你实习的一个重要部分是向该团队解释“不时雇佣实习生来做单元测试”在现实中不起作用。如果您不编写可测试的生产代码……令人惊讶的是:测试变得很难。也许您应该与这些人共享此链接。
YourRealDaoClass theMockedDao = new MockedDaoClass(...