Make42
Make42

Reputation: 13088

Expect a specific instance for mock in Scalamock

Why can I not tell a mock that it should expect an instance of a class without explicitly giving the type? Here is what I mean:

val myClass = new MyClass(...)
val traitMock = mock[MyTrait]
(traitMock.mymethod _).expects(myClass).returning(12.3)

does not work, while

val myClass: MyClass = new MyClass(...)
val traitMock = mock[MyTrait]
(traitMock.mymethod _).expects(myClass).returning(12.3)

does work. How come the type can not be inferred?

My testing part in build.sbt is

libraryDependencies ++= Seq(
  "org.scalatest" %% "scalatest" % "3.0.0" % "test"
    exclude("org.scala-lang", "scala-reflect")
    exclude("org.scala-lang.modules", "scala-xml")
)

libraryDependencies += "org.scalamock" %% "scalamock-scalatest-support" % "3.3.0" % "test"

Since I was asked for MyClass (it is SpacePoint here):

trait SpacePoint {
  val location: SpaceLocation
}
val sp = new SpacePoint {
  override val location: SpaceLocation = new SpaceLocation(DenseVector(1.0, 1.0))
}

Upvotes: 0

Views: 532

Answers (1)

tkachuko
tkachuko

Reputation: 1986

So actually it works for me. Let me mention that type inference in the code:

val myClass = new MyClass(...)

has nothing to do with ScalaMock but is guaranteed by scala itself. Below I will specify working sample with library versions and sources of the classes.

Testing libraries:

"org.scalatest" %% "scalatest" % "2.2.4" % "test",
"org.scalamock" %% "scalamock-scalatest-support" % "3.2.2" % "test"

Source code of classes:

class MyClass(val something: String)

trait MyTrait {

  def mymethod(smth: MyClass): Double
}

Source code of test:

import org.scalamock.scalatest.MockFactory
import org.scalatest.{Matchers, WordSpec}

class ScalamockTest extends WordSpec with MockFactory with Matchers {

  "ScalaMock" should {

    "infers type" in {
      val myClass = new MyClass("Hello")
      val traitMock = mock[MyTrait]
      (traitMock.mymethod _).expects(myClass).returning(12.3)

      traitMock.mymethod(myClass) shouldBe 12.3
    }
  }
}

Hope it helps. Will be ready to update answer once you provide more details.

Upvotes: 1

Related Questions