模拟第一次调用失败,第二次调用成功

2022-08-31 06:46:07

我想使用Mockito来测试下面的(简化)代码。我不知道如何告诉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();
  }
}

我可以通过以下方式设置成功测试:

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

失败测试与:

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

但是,我该如何测试如果它失败一次(或两次)然后成功,那就没问题了?


答案 1

文档中

有时,对于相同的方法调用,我们需要使用不同的返回值/异常进行存根。典型的用例可能是模拟迭代器。Mockito的原始版本没有这个功能来促进简单的嘲笑。例如,可以使用迭代器或简单的集合来代替迭代器。这些提供了自然的存根方式(例如,使用真正的集合)。不过,在极少数情况下,连续调用可能很有用:

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("You failed")
   .thenReturn("Success");

答案 2

写你想要的东西的最短方法是

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

当您提供多个参数以如下所示时,每个参数最多将使用一次,除了最后一个参数,该参数根据需要使用多次。例如,在这种情况下,如果您拨打电话4次,您将获得“成功”,“您失败了”,“您失败了”,“您失败了”。thenReturn


推荐