当前位置: 首页 > 知识库问答 >
问题:

Mockito中的模拟链调用导致NullPointerException或WurnTypeOfReturnValue

秦俊发
2023-03-14
requestTelemetryContext.getHttpRequestTelemetry().getContext().getOperation()
OperationContext operationContext = new OperationContext(null);
RequestTelemetryContext requestTelemetryContext = mock(RequestTelemetryContext.class);
when(requestTelemetryContext.getHttpRequestTelemetry().getContext().getOperation()).thenReturn(operationContext); //causes java.lang.NullPointerException
    OperationContext operationContext = new OperationContext(null);
    RequestTelemetryContext requestTelemetryContext = mock(RequestTelemetryContext.class);
    RequestTelemetry requestTelemetry = new RequestTelemetry();
    when(requestTelemetryContext.getHttpRequestTelemetry()).thenReturn(requestTelemetry);
    when(requestTelemetryContext.getHttpRequestTelemetry().getContext().getOperation()).thenReturn(operationContext);

org.mockito.exceptions.misusing.wurntypeofreturnvalue:OperationContext不能由gethtPrequestTelemetry()返回,如果您不确定为什么会超过错误读取,那么gethtPrequestTelemetry()应该返回RequestTelemetry***。由于语法的性质,上面的问题可能会发生,因为:

  • 此异常可能发生在错误编写的多线程测试中。请参阅关于并发测试限制的Mockito常见问题。
  • 使用when(spy.foo()).then()语法对间谍进行拦截。截断间谍更安全-
    • 和doReturnThrow()方法家族。有关mockito.spy()方法的javadocs的更多信息。

    我不明白为什么它不能只是模拟整个链调用,而且我也不像它在错误中所说的那样试图通过gethtPrequestTelemetry返回operationcontext

    编辑:我已经尝试过建议的方法:

    OperationContext operationContext = new OperationContext(null);
    
    RequestTelemetryContext requestTelemetryContext = mock(RequestTelemetryContext.class);
    RequestTelemetry requestTelemetry = mock(RequestTelemetry.class);
    TelemetryContext telemetryContext = mock(TelemetryContext.class);
    
    when(requestTelemetryContext.getHttpRequestTelemetry()).thenReturn(requestTelemetry);
    when(requestTelemetry.getContext()).thenReturn(telemetryContext);
    when(telemetryContext.getOperation()).thenReturn(operationContext);
    ThreadContext.setRequestTelemetryContext(requestTelemetryContext);
    

    不幸的是,requestTelemetry requestTelemetry=mock(requestTelemetry.class);行导致:

    Mockito不能模拟/监视,因为:

      null

共有1个答案

毛成济
2023-03-14

您需要在调用链的每个阶段返回mock,每个mock应该返回下一个mock对象。

a().b().c().d()

所以a()应该返回一个模拟,它被配置为返回一个模拟b等。

when(a()).thenReturn(mockA);
when(mockA.b()).thenReturn(mockB);

等等。

 类似资料:
  • 我从单元测试开始。我对一个类做了更改,在这个类中我不注入SessionContext,这样我就可以在需要时进行查找。 现在,在我的测试中,我想注入它,这样我就可以模拟查找方法: 我觉得很奇怪,因为我拥有所需的所有依赖项(这段代码在真实的应用程序中工作)。 如何使用mockito模拟和注入SessionContext?(我无法改变嘲讽框架)。

  • 因为MyFinalClass中的getObject(字符串名)方法的实现尚未完成,所以我在调用getObject方法时抛出新的MyException()。但是,该异常不会作为mockito.when(...)调用未被调用,导致断言失败。 请帮帮忙。谢谢你。

  • 基类 在派生类中不应用组合和其他函数。如果是,我是否应用了错误的模式?我应该如何处理相同的?

  • 在我的实现类中,我有一个读写锁定义,如下所示, 我在一个名为的方法中使用它, 正如我所说的,是null,但是rwLock是初始化的。请解释Mockito是如何发生这种情况的。理想的方法是什么?