你能给InOrder调用一个方法的次数增加一个限制吗



这是使用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次(通过调试确认)。

我发现了一个丑陋的解决方法:对所有方法参数使用ArgumentCaptors,然后使用:

inOrder.verify(foo, times(2)).writeMetric(captor1, etc etc);

然后检查那些捕获者的CCD_ 5的内容。但它相当丑陋。

理想情况下,我想修改上面的测试,如下所示:

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();

除了我丑陋的变通方法之外,还有其他可能吗?考虑到该方法的参数数量,这是一个相当少的编写/管理。。。

您似乎不是第一个要求使用此功能的人。

您应该能够几乎完全按照您的建议进行操作,而且只要额外的调用在预期调用之后,它似乎就可以工作。

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()验证阻止进一步调用。然而,正如上面的功能请求所指出的,除非您使用Mockito.verifyNoInteractions(foo),否则没有好的方法可以避免在预期调用之间或之前进行其他writeMetric调用。但这也会检查其他方法调用(这可能是您想要的)。CCD_ 10在这种情况下似乎并不太有用。不清楚它是否真的有用。

相关内容

  • 没有找到相关文章

最新更新