2017-04-19 46 views
0

这是IM如何嘲笑我的服务调用和返回一个假结果的动态类方法参数:惩戒使用scalatest/mockiton

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

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

的问题是在控制器方法myActionMethod当我打电话doSomething和传递参数IM调用一些财产,这将是在生产有返回值...

def myActionMethod() ... = { 

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

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

我还能如何嘲笑这个电话吗request.getSomeValue会不会抛出异常?

request.getSomeValue是动态的,我很遗憾不能把它在配置...

回答

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

在这里,我们希望在任何字符串发送和详细fakeRequestAsModel,要的Mockito返回这个答案这是你想要的。


注:

  1. 要小心,不要混用any的匹配与正常的价值观,你不能说: when(myService.doSomething(anyString(), fakeRequestAsModel))
    您需要用eqMockito()方法将正常值换行。
  2. 对于类型参数化参数,您可以使用any[classOf[T]]
  3. 请特别注意implicits

希望它能帮助!

+0

谢谢你!这有帮助。你可以解释一下'import org.mockito.Matchers。{eq => eqMockito,_}'这个import需要吗?主要是'eq => eqMockito' – JohnBigs

+0

@JohnBigs欢迎您!在Scala中,你可以**重命名**导入的东西,以避免名称冲突。例如,你想将'java.util.List'称为'JList'或类似的东西。在这里,我们将名为'eq'的方法重命名为'eqMockito'(或者任何你想要调用的方法)。您也可以从导入中排除一些内容,请参阅http://stackoverflow.com/questions/27945005/import-symbols-with-wildcard-but-rename-or-ignore-some-of-them –

+0

,所以我们只更改了名称所以它不会与scala eq冲突? – JohnBigs