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

时间:2019-06-19 23:57:19

标签: 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"

2 个答案:

答案 0 :(得分:1)

要么使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(...);

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

答案 1 :(得分:1)

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

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

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