这是使用mockito 1.10.19。
我有一个看起来像这样的测试:
final InOrder inOrder = inOrder(foo);
inOrder.verify(foo).writeMetric("c", "m", 2, 2, 4, 4, 1, 4);
inOrder.verify(foo).writeMetric("c", "m2", 3, 3, 4, 4, 1, 4);
inOrder.verify(foo).close();
inOrder.verifyNoMoreInteractions();
现在,我不得不修改foo
的行为;我使用更多数据更新了测试,对于此数据,不应再调用writeMetric()
方法。
不幸的是,测试仍然成功应该失败的地方。也就是说,我希望writeMetric()
被调用两次而不是更多,但它被调用了4次(通过调试确认)。
我找到了一个丑陋的解决方法:对{em>所有方法参数使用ArgumentCaptor
s然后使用:
inOrder.verify(foo, times(2)).writeMetric(captor1, etc etc);
然后检查这些绑定者的内容.getAllValues()
。但它相当难看。
理想情况下,我希望像上面那样修改上面的测试:
final InOrder inOrder = inOrder(foo);
inOrder.verify(foo).writeMetric("c", "m", 2, 2, 4, 4, 1, 4);
inOrder.verify(foo).writeMetric("c", "m2", 3, 3, 4, 4, 1, 4);
// Does not exist but it'd be nice if it did...
inOrder.verify(foo, noMore()).writeMetric(anyString(), etc etc);
inOrder.verify(foo).close();
inOrder.verifyNoMoreInteractions();
除了丑陋的解决方法之外,还有可能吗?鉴于该方法的参数数量,这对于编写/管理来说相当少......
答案 0 :(得分:0)
要求此功能看起来像you're not the first one。
你应该能够完全按照你的建议去做,而且似乎有效,只要额外的调用在预期之后进行。
final InOrder inOrder = inOrder(foo);
inOrder.verify(foo).writeMetric("c", "m", 2, 2, 4, 4, 1, 4);
inOrder.verify(foo).writeMetric("c", "m2", 3, 3, 4, 4, 1, 4);
inOrder.verify(foo, never()).writeMetric(anyString(), anyString(), anyInt(), anyInt(), anyInt(), anyInt(), anyInt(), anyInt());
inOrder.verify(foo).close();
隐式times(1)
验证允许首次调用发生,然后never()
验证会阻止进一步调用。但是,如上面的功能请求说明,除非您使用writeMetric
,否则无法在预期的通话之间或之前避免其他Mockito.verifyNoInteractions(foo)
来电。但这也会检查其他方法调用(可能是你想要的)。 inOrder.verifyNoMoreInteractions()
在这种情况下似乎没有太大用处。不清楚它是否真的有用。