【问题标题】:Mockito returns null instead of Future.successfulMockito 返回 null 而不是 Future.successful
【发布时间】:2017-08-04 17:31:18
【问题描述】:

我在让 Mockito 返回一个Future 时遇到了一点问题,该Future 被映射到被测单元中。

有问题的存根方法是这样的:

when(urlRequest.post(any())).thenReturn(Future.successful(badOAuthResponse))

其中badOAuthQuery 是在别处定义的MapbadOAuthResponse 是在别处定义的模拟WSResponse

调用它的有问题的行是:

val response = client.url(oAuthUrl).withHeaders(headers: _*).post(requestMap)

其中client 是一个模拟的WSClient,其方法在其他地方存根。

我已将问题范围缩小到 POST 请求周围的某个地方。单步调试器显示.post() 之前的所有先前方法调用都返回正常,但越过该行,response 设置为null

之后的那一行,NullPointerException 实际被触发的地方是这样的:

response.map { resp =>

显然问题是response在之前的行中被设置为null,但我不知道为什么Mockito没有返回一个成功的Future包含上面的模拟对象。

任何帮助将不胜感激!谢谢!

【问题讨论】:

  • 您确定badOAuthQueryrequestMap 相同(即,调用badOAuthQuery.equals(requestMap) 返回true)?我怀疑不是这样,当你看到这样的模拟返回 null 时,这通常是问题(因为当你没有显式存根时,Mockito 模拟默认返回空值)。
  • 嗯,我又看了一遍,觉得可能是这个问题。我尝试改用when(urlRequest.post(any())).thenReturn(Future.successful(badOAuthResponse)) 并稍后修复细节,但我仍然遇到相同的null 问题。
  • client.url(oAuthUrl).withHeaders(headers: _*) 是否返回 urlRequest
  • 在这种情况下,客户端是具有以下模拟方法的 wsClient 模拟:when(wsClient.url(any())).thenReturn(urlRequest) when(urlRequest.withHeaders(any())).thenReturn(urlRequest) when(urlRequest.post(any())).thenReturn(Future.successful(badOAuthResponse))

标签: scala mockito playframework-2.3


【解决方案1】:

好的,经过一番摸索,我找到了问题所在。事实证明,我正在模拟的对象 (WSRequestHolder) 有两个称为 post 的方法:post(body: File)post[T](body: T)(implicit wrt: Writeable[T], ct: ContentTypeOf[T])。我曾假设我的 mock 是为后一种方法调用设置的,但事实证明我需要更明确地调用该方法,如下所示:

when(urlRequest.post[Map[String, Seq[String]]](any())(any(), any())
  .thenReturn(Future.successful(badOAuthResponse))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-18
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    相关资源
    最近更新 更多