我可以在Mockito when()语句中检查参数吗?

时间:2014-08-28 17:18:13

标签: scala testing mockito

我在Scala中使用Mockito,我有一个if()语句,如下所示:

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是否具备我在这里寻找的能力。

1 个答案:

答案 0 :(得分:4)

如果要在存根中实现自定义逻辑,可以使用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 documentation对此功能的说法如下:

  

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

使用它并不是Mockito哲学的一部分,而且通常表明你试图用你的模拟过于复杂(也许是因为你测试的代码本身太复杂了)。当然,您可能会发现一些特殊情况,很难找到更好的解决方案,因此该功能一直存在。