2013-10-03 48 views
2

我正在嘗試使用Mockito爲Web服務編寫一個模擬。模擬應該使用play WS庫來模擬POST請求。Scala Spec2 Mockito:複雜類型的參數匹配器

/** 
* Mock for the Web Service 
*/ 
case class WSMock() extends Mockito { 
    val wsRequestHolder: play.api.libs.ws.WS.WSRequestHolder = mock[play.api.libs.ws.WS.WSRequestHolder] 

    val wsResponse: play.api.libs.ws.Response = mock[play.api.libs.ws.Response] 
    wsResponse.status returns 200 
    wsResponse.body returns "BODY RESP FROM WS" 

    val futureResponse = scala.concurrent.Future { wsResponse } 

    wsRequestHolder.post(any[Map[String,Seq[String]]]) returns futureResponse 
} 

運行測試時我得到以下錯誤:

[error]  InvalidUseOfMatchersException: 
[error] Invalid use of argument matchers! 
[error] 3 matchers expected, 1 recorded: 
[error] -> at org.specs2.mock.mockito.MockitoMatchers$class.any(MockitoMatchers.scala:24) 
[error] 
[error] This exception may occur if matchers are combined with raw values: 
[error]  //incorrect: 
[error]  someMethod(anyObject(), "raw String"); 
[error] When using matchers, all arguments have to be provided by matchers. 
[error] For example: 
[error]  //correct: 
[error]  someMethod(anyObject(), eq("String by matcher")); 
[error] 
[error] For more info see javadoc for Matchers class. 

它看起來對我的任何[...]使用複雜型(帶嵌套類型參數)的表達不正確解決爲匹配器。但是,我沒有看到原始類型在哪裏發揮作用。 指定參數Map[String,Seq[String]]的匹配器的正確方法是什麼?

非常感謝!

回答

2
wsRequestHolder.post(any[Map[String,Seq[String]]]) returns futureResponse 

注意post居然有一對額外的隱含參數有:

def post [T] (body: T)(implicit wrt: Writeable[T], ct: ContentTypeOf[T]): 
    Promise[Response] 

...這可能需要顯式地匹配,如this spec2-users thread

0

看來wsRequestHolder.post方法需要三個參數,因此Mockito希望您發送三個(例如任何[])匹配器,但您只爲其中的一個提供了匹配器。