user866364
user866364

Reputation:

Specs2 - Mock objects inside method

I'm writting unit tests and i would like to know if it's possible to mock an object that is instanced inside the method that i'm testing.

Here is an example of a method that i would like to test:

def sendMessageToBroker(message:Message) = {

  val soapBody = xmlBody("user", "pass", message.identifier, 
      message.to, message.message)

  val response = new WebServiceUtil().doPost("uri", soapBody.toString(),
  "text/xml; charset=utf-8", "action")

  response
} 

I was wondering if it's possible to do something like:

when call doPost, return new Response(200, 'Success')

Is it possible?

I've tried do it using spy() and mock, but no sucess:

val ws = new WebServiceUtil

val spiedObj = spy(ws)
spiedObj.doPost("uri", xml,
  "text/xml; charset=utf-8",
  "action") returns new Response(200, "Success")

val xx = messageService.sendMessageToBroker(new Message())

Any ideas on how can i do it?

Upvotes: 0

Views: 659

Answers (1)

Eric
Eric

Reputation: 15557

You could write

val webService = mock[WebServiceUtil]

webService.doPost("uri", xml, "text/xml; charset=utf-8", "action") returns 
   new Response(200, "Success")

// pass the mock webservice as an argument
sendMessageToBroker(new Message, webService)

The important part is that you need to be able to pass a mock WebServiceUtil to your method being tested! There are many ways to do that. The simplest one is to pass the instance to a constructor method of our "class under test":

class MyClass(webService: WebServiceUtil) {
  def sendMessageToBroker(message: Message) = {
    // use the webservice
  }
}

A more involved method would use Guice and the Inject annotation to pass the service (especially since you tagged the question as a play-framework-2.0 one). You will be interested in following this SOF question then.

Upvotes: 0

Related Questions