2017-04-19 48 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