我在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是否具备我在这里寻找的能力。
答案 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哲学的一部分,而且通常表明你试图用你的模拟过于复杂(也许是因为你测试的代码本身太复杂了)。当然,您可能会发现一些特殊情况,很难找到更好的解决方案,因此该功能一直存在。