模拟第一个呼叫失败,第二个呼叫成功

我想用Mockito来testing下面的(简化)代码。 我不知道如何告诉Mockito第一次失败,然后第二次成功。

for(int i = 1; i < 3; i++) { String ret = myMock.doTheCall(); if("Success".equals(ret)) { log.write("success"); } else if ( i < 3 ) { log.write("failed, but I'll try again. attempt: " + i); } else { throw new FailedThreeTimesException(); } } 

我可以设置成功testing:

 Mockito.when(myMock).doTheCall().thenReturn("Success"); 

并用下列失败testing:

 Mockito.when(myMock).doTheCall().thenReturn("you failed"); 

但我怎么能testing,如果它失败了一次(或两次),然后成功,这很好?

从文档 :

有时我们需要为同一个方法调用存根不同的返回值/exception。 典型的用例可能是嘲讽迭代器。 原始版本的Mockito没有这个function来促进简单的嘲笑。 例如,而不是迭代器可以使用Iterable或简单的集合。 那些提供自然的方式(例如使用真正的collections)。 在极less数的情况下,连续调用可能是有用的,但是:

 when(mock.someMethod("some arg")) .thenThrow(new RuntimeException()) .thenReturn("foo"); //First call: throws runtime exception: mock.someMethod("some arg"); //Second call: prints "foo" System.out.println(mock.someMethod("some arg")); 

所以在你的情况下,你会想要:

 when(myMock).doTheCall() .thenReturn("Success") .thenReturn("you failed"); 

写你想要的最短的方法是

 when(myMock.doTheCall()).thenReturn("Success", "you failed"); 

当你提供多个参数, thenReturn像这样返回时,每个参数最多只能使用一次,除了最后一个参数,必要时多次使用。 例如,在这种情况下,如果您拨打电话4次,您将获得“成功”,“失败”,“失败”,“失败”。

由于与此相关的评论很难阅读。 我将添加一个格式化的答案。

如果你正在试图做一个void函数。 你可能想要一个exception而不是行为。 那么你会做这样的事情:

 Mockito.doThrow(new Exception("MESSAGE")) .doNothing() .when(mockService).method(eq());