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

Mocking a dynamic class method argument using scalatest/mockiton

这就是我如何模拟我的服务调用并return获得虚假结果的方式:

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

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

当我调用 doSomething 并传递参数时,问题出在控制器方法 myActionMethod 中,我调用了一些 属性 ,这只会 return 一些东西在生产中。 ..

def myActionMethod() ... = {

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

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

我怎样才能模拟这个调用,这样 request.getSomeValue 就不会抛出异常?

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

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

这里我们希望 Mockito return 在发送 任何字符串 并且准确 fakeRequestAsModel 时回答这个问题。


备注:

  1. 注意不要将 any 匹配器与正常值混在一起,你不能说: when(myService.doSomething(anyString(), fakeRequestAsModel)).
    您需要使用 eqMockito() 方法包装正常值。
  2. 您可以使用 any[classOf[T]] 作为类型参数化参数。
  3. 要格外小心

希望对您有所帮助!