2014-08-28 88 views
0

我使用带的Mockito斯卡拉,和我有一个看起来像这样的时候()语句:我可以检查一个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有我在这里寻找的功能。

回答

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 
    } 
    } 
) 

这不是很阶状,因为它可以与纯斯卡拉封闭一个更简单的方法来完成,但它能够完成任务。

但是,请注意,这里是什么Mockito documentation说,关于这个功能:

然而,这是不包括在最初的Mockito另一个有争议的功能。我们建议只使用thenReturn()或ThenThrow()来使用简单的stubbing。这两个应该足以测试/测试任何干净的简单代码。

使用,这是不是真正的哲学的Mockito的一部分,它通常是一个迹象,表明你想与你的模拟做的是过于复杂(也许是因为你正在测试的代码过于复杂本身)。当然,你可能会发现一些例外的情况,很难找到更好的解决方案,因此该功能为什么存在。

相关问题