【发布时间】:2015-04-09 10:48:12
【问题描述】:
是否可以在使用非预定义参数调用模拟时抛出异常?有Answers.RETURNS_SMART_NULLS,但这并不是我真正需要的,因为如果null 是合法的返回值,它就不起作用,这不会导致NullPointerException,而是会导致以后出现错误。
编辑:一些背景。因此,在 Mockito 中,当您定义一个模拟时,您可以像这样指定每个调用的返回值:
when(myMock.someMethod(arg1, arg2)).thenReturn(returnValue);
当myMock.someMethod 用参数调用时,我没有在测试中给出返回值,它只返回null。我想将它配置为立即崩溃并告诉我我忘记为某些参数组合定义返回值。
编辑 2:有人建议提供一个自定义 defaultAnswer,它会在调用时引发异常。不幸的是,这不起作用。即使存在模拟,也会调用默认答案的answer() 方法。这是一个示例:
public class Test {
public static class Adder {
public int add(int a, int b) {
return a + b;
}
}
public static final Answer<Object> THROW_ON_UNDEFINED_ARGS = new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
throw new IllegalArgumentException(
String.format("Calling a mock with undefined arguments: %s %s",
invocation.getMethod(),
Arrays.toString(invocation.getArguments())));
}
};
public static void main(String[] args) {
Adder adderMock = mock(Adder.class, THROW_ON_UNDEFINED_ARGS);
when(adderMock.add(2, 3)).thenReturn(5);
System.out.println(adderMock.add(2, 3));
}
}
即使定义了adderMock.add(2, 3),也会引发异常。
【问题讨论】:
-
“是否可以在使用非预定义参数调用模拟时抛出异常?” - 这到底是什么意思?如果传递了某些参数,您想模拟抛出异常吗?非预定义参数是什么意思?
-
因此,在 Mockito 中,您可以像这样定义模拟的返回值:
when(myMock.someMethod(arg1, arg2)).thenReturn(result)。如果使用其他一些参数调用myMock.someMethod,它会返回 null。我希望它立即失败并告诉我,该模拟是用参数调用的,我没有为其定义返回值。