您是否可以为使用InOrder调用方法的次数添加限制?

时间:2015-11-09 10:38:21

标签: java mockito

这是使用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();

除了丑陋的解决方法之外,还有可能吗?鉴于该方法的参数数量,这对于编写/管理来说相当少......

1 个答案:

答案 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()在这种情况下似乎没有太大用处。不清楚它是否真的有用。