使用scalatest / mockiton模拟动态类方法参数

时间:2017-04-19 00:53:42

标签: scala mocking mockito scalatest

这就是我嘲笑我的服务电话并返回假结果的方式:

when(myService.doSomething("",fakeRequestAsModel)) thenReturn fakeResult

val result = call(controller.myActionMethod(), request)

问题出现在控制器方法myActionMethod中,当我调用doSomething并传递参数时,我会调用一些只会在生产中返回内容的属性......

def myActionMethod() ... = {

   myService.doSomething(request.getSomeValue,requestAsModel)
   ...
}

所以,getSomeValue是一种我只能在生产中调用的方法,它带有第三方库,我无法覆盖它。

我怎么还能模仿这个电话,所以request.getSomeValue不会给我一个例外?

request.getSomeValue是动态的,我不幸地把它放在配置中......

1 个答案:

答案 0 :(得分:2)

// we rename this because Scala defines `eq` on `AnyRef`
import org.mockito.Matchers.{eq => eqMockito, _} 
...
when(myService.doSomething(anyString(), eqMockito(fakeRequestAsModel))) 
  thenReturn fakeResult

我们希望Mockito在发送任何字符串并确切fakeRequestAsModel时返回此答案,这就是您想要的。

注意:

  1. 小心不要将any匹配器与正常值混合,你不能说: when(myService.doSomething(anyString(), fakeRequestAsModel))
    您需要使用eqMockito()方法包装正常值。
  2. 您可以将any[classOf[T]]用于类型参数化参数。
  3. 要特别注意implicits
  4. 希望它有所帮助!