Java Mockito:如何准备不同的答案


int calledCnt = 0;
doAnswer(i -> {
    if (calledCnt == 0) {
        calledCnt += 1;
        throw new InternalServerErrorException("test");
    }
    return false;
}).when(myClass.someFunction(any()));

我想存根一个调用,如果最初调用它抛出异常,但任何后续调用都将返回 false;

上述电话投诉"Variables used in lambda should be final or effectively final"

根据myClass是你正在测试的东西,还是依赖项,我建议全部或部分模拟myClass(即至少是someFunction()调用(。使用then...()方法,您可以指定返回的一系列项目,例如:

when(myMockedClass.someFunction(any()))
    .thenThrow(new InternalServerErrorException("test"))
    .thenReturn(false);

第一次调用将引发异常,第二次调用和所有后续调用将返回 false。

要么使calledCnt可变的东西(例如,具有单个元素的int[],或者AtomicInteger(,要么将答案声明为匿名类,以便您可以添加成员变量:

doAnswer(new Answer<Boolean>() {
  int calledCnt = 0;
  @Object public Boolean answer(InvocationOnMock invocation) {
    if (calledCnt == 0) {
      calledCnt += 1;
      throw new InternalServerErrorException("test");
    }
    return false;
  }
}).when(...);

(实际上,它不一定是匿名类,它可以是任何类型的类。使用匿名类非常方便,因为它将所有内容本地化到使用它的位置。

相关内容

  • 没有找到相关文章

最新更新