java - 如何覆盖 Mockito 中 unstubbed void 方法的默认行为?

标签 java junit mockito

<分区>

我正在模拟一个相当复杂的对象层次结构,并且在我处理它时,可以涉及大量方法。如果我错过了一个非 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/

相关文章:

java - Mockito 监视被单元测试的对象

java - 如果我们没有为对象创建引用变量,如何关闭扫描器类,那么如何避免资源泄漏警告消息

java - 获取套接字数据后调用单独的线程进行进一步处理?

java - 如何在类级别重复 JUnit5 测试?

java - 我无法使用 Mockito 和 PowerMockito 模拟静态方法

testing - 进行 mvn 安装时模拟测试失败

java - 使用 Spring Security 进行 JUnit 测试

JavaBean 和 DSL

java - 自定义方法的 JUnit 测试用例

java - 如何测试使用 Pageable 对象的 REST Controller