模拟第一个呼叫失败,第二个呼叫成功
我想用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());