我在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做的事情过于复杂(可能是因为你测试的代码本身太复杂了)。当然,你可能会发现一些特殊情况,很难找到更好的解决方案,这就是为什么这个功能存在的原因。