SpecsでMockitoのAnswerとArgumentCaptorを使う

Answerはこんな感じで簡単に書けます。anyStringはMockitoのMatcher(org.mockito.Matcher)であることに注意。また、引数(以下の場合はname)はAnyで渡ってきます。

val helloWorld = mock[UserService]
helloWorld.hello(anyString) answers { name =>
 "Hello " + name.toString + "!"
}

ArgumentCaptorは特に専用の構文は用意されていないようなので普通に使います。

val helloWorld = mock[UserService]
val captor = ArgumentCaptor.forClass(classOf[String])

// 実行
...

there was one(helloWorld).hello(captor.capture())
val name = captor.getValue
name mustBe "Naoki Takezoe"

ArgumentCaptorを使う場合、引数が1つの場合はいいのですが、複数の引数を持つメソッドに対して使う場合はMockitoのMatcherでマッチさせる必要があるのですが、このときeqなどのMatcherがSpecsのMatcherと衝突してしまうため、併用する場合は以下のように記述しなければなりません。

there was one(helloWorld).hello(captor.capture(), Matcher.eq(1))

まあ仕方ないんですけどちょっといけてないですね。