<分区>
我正在模拟一个相当复杂的对象层次结构,并且在我处理它时,可以涉及大量方法。如果我错过了一个非 void 方法并保留了 unstubbed,默认情况下 Mockito 会使其返回 null,这会快速触发 NPE,而且我很容易找到它。但是,如果我错过了一个 void 方法,默认行为是什么都不做,这经常会导致下游失败并且更难调试。我想更改此默认设置,例如抛出自定义异常,但似乎找不到办法。 提前致谢!
<分区>
我正在模拟一个相当复杂的对象层次结构,并且在我处理它时,可以涉及大量方法。如果我错过了一个非 void 方法并保留了 unstubbed,默认情况下 Mockito 会使其返回 null,这会快速触发 NPE,而且我很容易找到它。但是,如果我错过了一个 void 方法,默认行为是什么都不做,这经常会导致下游失败并且更难调试。我想更改此默认设置,例如抛出自定义异常,但似乎找不到办法。 提前致谢!
最佳答案
你可以写一个默认答案,作为参数传递给Mockito.mock
.不幸的是,由于 Java 注释的限制,为 @Mock
设置此默认行为并不容易。 -带注释的字段。
public static class ThrowingAnswer implements Answer<Object> {
@Override public Void answer(InvocationOnMock invocation) throws Throwable {
if (invocation.getMethod().getReturnType() == Void.TYPE) {
throw new UnsupportedOperationException(String.format(
"Method %s not stubbed on %s",
invocation.getMethod().getName(),
invocation.getMock()));
}
return Answers.RETURNS_DEFAULTS.answer(invocation);
}
}
YourClass mockYourClass = Mockito.mock(YourClass.class, new ThrowingAnswer());
虽然你会被迫使用 doAnswer()
void
的语法无论如何,请注意如果您更改以上内容以包含非 void 方法,您将被迫使用 doReturn()
句法。这是因为 when(foo.bar()).thenReturn(baz)
依赖于对 foo.bar()
的调用在 when()
内语句,但您将 stub 以抛出异常。
此外,如果您发现很难分辨哪些 void 方法与 external-enough-to-mock 服务上的 stub 相关,则可能是您的服务正在做太多的代码味道,或者您的系统在下面-test 的交互定义不够好。如果您发现自己经常遇到这种情况,可能是时候记录、重构或两者兼而有之了。
关于java - 如何覆盖 Mockito 中 unstubbed void 方法的默认行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35925340/