bsky
bsky

Reputation: 20242

Check what the method of mocked object receives

In my project, whenever a class produces some output, instead of doing println it calls OutputStore.write, which is a class and method I defined.

I am trying to test the output of another class so I mocked OutputStore. I want to see what parameters it receives to OutputStore.write.

val mockOutputStore = mock[OutputStore]

I would like to do something like this:

val argument = ArgumentCaptor.forClass(classOf[OutputStore])
verify(mockOutputStore).write(argument.capture())
assertEquals("some parameter", argument.getValue())

However, this doesn't compile as verify is not even recognized.

The signature of my test class is this:

class SomeUnitTestSet extends org.scalatest.FunSuite with MockitoSugar with PropertyChecks

Any idea how to check what parameters a mocked object's method receives?

Upvotes: 1

Views: 519

Answers (1)

SergGr
SergGr

Reputation: 23788

Here is a translation of what @JBNizet suggested into a Scala code

Assuming you have your OutputStore class

class OutputStore {
  def write(msg: String) = {
    println(msg)
  }
}

and some OutputStoreApiUser class

class OutputStoreApiUser(val outputStore: OutputStore) {
  def foo(): Unit = {
    outputStore.write("some parameter")
    outputStore.write("some parameter2")
  }
}

Then your test might be something like this (in real life you probably @Inject outputStore but this is not relevant here):

import org.mockito.Mockito.verify // static import!
import org.scalatest.mockito.MockitoSugar
import org.scalatest.prop.PropertyChecks

class SomeUnitTestSet extends org.scalatest.FunSuite with MockitoSugar with PropertyChecks {

  test("Capture calls"){
    val mockOutputStore = mock[OutputStore]
    val apiUser = new OutputStoreApiUser(mockOutputStore)
    apiUser.foo()
    verify(mockOutputStore).write("some parameter")
    verify(mockOutputStore).write("some parameter2")
  }

}

This one compiles and works for me as I would expect

Upvotes: 2

Related Questions