当前位置: 首页 > 面试题库 >

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

奚昌胤
2023-03-14
问题内容

我想使用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");

但是,如何测试一次失败(或两次)然后成功,就可以了吗?


问题答案:

从文档:

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

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


 类似资料:
  • 我是RXJava的新手。在一个场景中,我希望调用第一个登录webservice(),如果成功,则希望调用另一个webservice()以获取用户信息。

  • 问题内容: 我要尝试测试其呼叫顺序的三个功能。 假设在模块module.py中,我有以下内容 我想检查b在a之后和c之前被调用。因此,对a,b和c中的每一个进行模拟都是容易的: 检查每个单独的模拟都被调用也很容易。如何检查呼叫相对于彼此的顺序? 将无法使用,因为每个模拟都单独维护。 我尝试使用副作用来记录每个调用: 但这仅给我提供了与模拟一起调用的args,而没有给实际调用的模拟。我可以添加更多逻

  • 问题内容: 我正在尝试模拟一些基于反射的方法。您可以在下面看到详细信息, 被测课程 测试 } 要么 但是,测试失败,并显示NullPointerException。我知道我在嘲笑概念上做错了什么,但是我不明白这是什么。您能否对此加以说明,并建议我如何测试此方法? 谢谢。 问题答案: 您需要一个Method对象和一个Class对象。根据您的评论,Mockito无法模拟方法,因此您需要一个真正的方法。

  • 我在调用我的onLeScan时遇到问题。我在开始扫描中放置了一个标签,每次都会被调用。出于某种原因,我的onLeScan永远不会被调用。有人看到我所做的有问题吗?onLeScan应该在开始扫描后立即调用,对吗? 编辑更改了我的onLeScan函数。仍然不起作用,但我认为我正在走向正确的道路。DeviceBeacon是一个只包含方法的类:getName()、getSignal()和getAddres

  • 1、接口声明 如果您希望在自己的CRM系统嵌入呼叫中心能力,需要对接智齿呼叫中心能力,在对接前请您阅读如下对接流程,以便您更好的完成对接。如果只对接基本呼叫能力,预计对接及调试过程1周左右即可完成。 第一步:获取第三方用户接口调用唯一凭证 请联系您的售后经理,获取您企业的如下信息: 1、companyid(企业id) 2、appid(第三方用户接口调用唯一凭证id) 3、app_key(第三方用户