我可以检查Mockito when()语句中的参数内部吗



我在Scala中使用Mockito,我有一个when()语句,看起来像这样:

when(iService.find(any[InventoryRequest])).thenReturn(invResponse)

这是可行的,但我想根据InventoryRequest(一个案例类)中的有效负载来制作一些不同的返回响应。

所以我会做这样的事情:

when(iService.find(any[InventoryRequest] and therequest.field==1)).thenReturn(invResponse1)
when(iService.find(any[InventoryRequest] and therequest.field==2)).thenReturn(invResponse2)

等等。本质上是查看传递的参数,并根据它返回不同的响应。

是的,我可以通过创建一大堆不同的测试类来做到这一点,但我想知道Mockito是否具备我在这里寻找的功能。

当您想在存根中实现自定义逻辑时,可以使用thenAnswer方法,该方法将自定义Answer[T]作为参数。您必须使用自定义逻辑来实现一个答案。下面是一个示例,使用Answer:的匿名实现

when(iService.find(any[InventoryRequest])).thenAnswer(
  new Answer[ResponseType] {
    def answer(invocation: InvocationOnMock): ResponseType = {
      val args = invocation.getArguments
      val therequest = args(0).asInstanceOf[InventoryRequest] // Not type-safe!
      if (therequest.field == 1) invResponse1 else invResponse2
    }
  }
)

它不是很像scala,因为它可以用一种更简单的方式在纯scala中使用闭包来完成,但它完成了任务。

然而,请注意,以下是Mockito文档对该功能的描述:

还有一个有争议的功能,它最初没有包含在Mockito中。我们建议仅使用带有thenReturn()或thenThrow()的简单存根。这两个应该刚好足以测试/试驾任何干净的&简单代码。

使用它并不是Mockito哲学的一部分,它通常表明你试图用mock做的事情过于复杂(可能是因为你测试的代码本身太复杂了)。当然,你可能会发现一些特殊情况,很难找到更好的解决方案,这就是为什么这个功能存在的原因。

相关内容

  • 没有找到相关文章