是否可以在使用非预定义参数调用模拟时抛出异常?有Answers.RETURNS_SMART_NULLS,但它并不是我真正需要的东西,因为它不起作用,如果null是合法的返回值,这不会导致NullPointerException,而是后来的错误.
编辑:一些背景.因此,在定义模拟时,在Mockito中,您可以为每个调用指定返回值,如下所示:
when(myMock.someMethod(arg1, arg2)).thenReturn(returnValue);
Run Code Online (Sandbox Code Playgroud)
当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));
}
}
Run Code Online (Sandbox Code Playgroud)
即使adderMock.add(2, 3)已定义,也会抛出异常.
您可以Answer在模拟的构造中提供一个默认值,它始终抛出异常.然后每个被存根的电话都会像往常一样.这些路径之外的所有东西都会抛出异常.像这样的东西:
final String arg = "some arg";
Collection<Object> object = mock(Collection.class, new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
throw new IllegalArgumentException("You cannot invoke " + invocation.getMethod() +
" with " + Arrays.toString(invocation.getArguments()));
}
});
doReturn(true).when(object).add(arg);
object.add(arg); // Goes ok
object.add("azertyuiop"); // Throws the exception
Run Code Online (Sandbox Code Playgroud)
只需指出另一种可以做到这一点的方法,使用thenAnswer:
when(myMock.someMethod(anyString(), anyString())).
thenAnswer(new Answer<String>() {
@Override
public String answer(InvocationOnMock invocation) throws Throwable {
Object[] args = invocation.getArguments();
String arg1 = (String) args[0];
String arg2 = (String) args[1];
if ("arg1".equals(arg1) && "arg2".equals(arg2)) return "someValue";
throw new Exception();
}
});
myMock.someMethod("arg1", "arg2"); // Returns "someValue"
myMock.someMethod("xxx", "yyy"); // Throws Exception
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你。
| 归档时间: |
|
| 查看次数: |
11975 次 |
| 最近记录: |