gpt4 book ai didi

java - 当使用未定义的参数调用模拟时,如何使 Mockito 抛出异常?

转载 作者:太空狗 更新时间:2023-10-29 22:35:10 24 4
gpt4 key购买 nike

是否可以在使用非预定义参数调用模拟时抛出异常?有 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) 也会抛出异常。

最佳答案

您可以在构造总是抛出异常的模拟中提供默认的Answer。然后每个被 stub 的电话都会像往常一样。这些路径之外的所有内容都会抛出异常。像这样:

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

关于java - 当使用未定义的参数调用模拟时,如何使 Mockito 抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29536418/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com