hon*_*rst 3 java call verify mockito
我有一些逻辑需要测试,例如:
{
...
A.add("1");
...
A.add("what ever");
...
A.add("2");
A.delete("5");
...
}
Run Code Online (Sandbox Code Playgroud)
我已经在测试中模拟了A,并且可以测试对参数(“ 2”)调用一次add方法,例如:
Mockito.verify(mockedA).add("2");
Run Code Online (Sandbox Code Playgroud)
我的问题是如何测试是否可以验证对方法add的最后一次调用是add(“ 2”)而不是其他参数。
由于上面的测试无法捕获是否有人无意中在最后添加了另一个调用,例如add(“ 3”)。请注意,之后我们不再关心A上的其他方法调用。我们也不在乎调用方法的时间,调用方法的顺序。这里的关键是我们是否可以验证某个嘲笑对象的某个方法的最后一个真参数。
如果您问为什么需要这样的功能,我会说在现实世界中,我们可能需要处理一些设置某些事物的逻辑,最后设置的获胜者,为了避免某人意外地设置一些其他未预期的事物,我会喜欢用我们的UT来捕捉这一点。并且为了不使测试变得过于复杂和整洁,因此我只希望验证对象的特定方法的最后一次调用,而不要验证诸如order / noMoreInteractions / AtMostTimes之类的东西。
感谢@staszko032,受到ArgumentCaptor的启发,我们可以使用captor的getValue,而不是getAllValues并验证序列,因为captor的getValue总是获得最后一个真实的参数。我们可以这样做:
ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
Mockito.verify(mockedA, Mockito.atLeastOnce()).add(captor.capture());
Assert.assertEquals("2", captor.getValue());
Run Code Online (Sandbox Code Playgroud)
关于调用顺序
默认情况下,Mockito.verify()调用顺序无关紧要。
要考虑到这一点,请将模拟包装在一个InOrder实例中,然后对该实例执行调用验证。
关于不再互动
如果在要验证的方法之后不再调用该模拟,则可以使用Mockito.verifyNoMoreInteractions(Object... mocks)该方法来检查给定的任何模拟是否具有未验证的交互,例如:
InOrder inOrder = Mockito.inOrder(mockedA);
inOrder.verify(mockedA).add("1");
inOrder.verify(mockedA).add("2");
Mockito.verifyNoMoreInteractions(mockedA);
Run Code Online (Sandbox Code Playgroud)
如果在您要验证的方法之后仍然可以调用该模拟,则可以在verify(T mock, VerificationMode mode)传递给您的a验证VerificationMode最多执行2次调用之后,在对调用进行验证之后进行添加。
InOrder inOrder = Mockito.inOrder(mockedA);
inOrder.verify(mockedA).add("1");
inOrder.verify(mockedA).add("2");
Mockito.verify(mockedA, Mockito.atMost(2)).add(Mockito.anyString());
Run Code Online (Sandbox Code Playgroud)
关于您的想法和这种嘲笑方式的警告
由于上面的测试无法捕获是否有人无意中在最后添加了另一个调用,例如add(“ 3”)。
Mockito提供了一个功能强大且广泛的工具包,可用于模拟。某些功能(例如,验证),尤其是可以验证没有检测到有关模拟或特定模拟方法的更多交互,会使测试的读取和维护更加复杂。
以及,当前您要检查对某个模拟的调用是否以特定顺序执行。但是您通常只想根据业务/逻辑方案的需要使用这些检查,而不是技术调用。
例如,假设在测试的方法中,由于业务原因,模拟方法被调用3次,而模拟方法被调用2次。检查它仅被调用两次,而在两次预期的调用中则不会更多。
但是通常,您应该谨慎一点,即单元测试不要过度使用模拟验证,该模拟验证看起来像是对流描述的断言,而不是对行为/逻辑的断言。
| 归档时间: |
|
| 查看次数: |
2585 次 |
| 最近记录: |