I've been doing what an old colleague of mine used to call "Stack-Whoring" a bit recently - trying to get a few more badges and also up my general reputation on
Stack Overflow. It's been fun and educational, and I wanted to post (mainly for my own reference) how to use Mockito's powerful
ArgumentCaptor
facility from inside a Specs2 example:
I'm just going to nab my own answer from the
relevant SO question:
class ApplicationSpec extends Specification with Mockito {
val mockedNewsRenderer = mock[List[String] => Html]
val controller = new ApplicationController {
override def renderNews(s:List[String]) = mockedNewsRenderer(s)
}
"Application News Controller" should {
"Pass a non-empty list of news items to the template" in {
val result = controller.newsAction(FakeRequest())
status(result) must beEqualTo(200)
val captor = ArgumentCaptor.forClass(classOf[List[String]])
there was one(mockedNewsRenderer).apply(captor.capture())
val theArgument = captor.getValue
theArgument.isEmpty must beFalse
}
}
}
The trickiest bit (if you're already familiar with
ArgumentCaptor
usage in Java) is the use of
classOf[T]
to get the Scala equivalent of Java's
.class
so you can then call
ArgumentCaptor.forClass()
.
There's probably scope there for a
Pimp My Library tweak to tidy up that particular line - I'm thinking I'd like to just be able to say:
val captor = ArgumentCaptor.for[List[String]]
Stay tuned ...