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"
答案 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。