如何使用ScalaMock通过名称函数模拟调用?

时间:2018-05-16 19:57:55

标签: scala unit-testing scalamock

我希望能够使用ScalaMock模拟我的call-by-name函数,因此它可以在我的mock中运行传递的函数。

Main

我试过用这种方式模拟这个函数:

class MyTest extends Specification with MockFactory {

  trait myTrait {
    def myFunction[T](id: Int, name: String)(f: => T): Either[ErrorCode,T]
  }

  def futureFunction() = Future {
    sleep(Random.nextInt(500))
    10
  }

  "Mock my trait" should {
    "work" in {
      val test = mock[myTrait]

      (test.myFunction (_: Int)(_: String)(_: T)).expects(25, "test",*).onCall {
        _.productElement(2).asInstanceOf[() => Either[ErrorCode,T]]()
      }
      test.myFunction(25)("test")(futureFunction()) must beEqualTo(10)
    }
  }

}

但是当我运行测试时,我收到了这个错误:

(test.myFunction (_: Int)(_: String)(_: T)).expects(25, "test",*).onCall {
    _.productElement(2).asInstanceOf[() => Either[ErrorCode,T]]()
  }

我如何模拟它,因此它在mock中运行我的 futureFunction()并返回结果。

1 个答案:

答案 0 :(得分:1)

一位朋友帮我找到了解决方案。这个问题与我对 myFunction()的模拟有关。我将一个按名称调用的函数传递给 myFunction()(f:=&gt; T),在评估它之后返回 T myFunction()< / strong>返回 [ErrorCode,T] 。所以模拟应该是这样的:

(test.myFunction (_: Int)(_: String)(_: T)).expects(25, "test",*).onCall { test =>
    Right(test.productElement(2).asInstanceOf[() => T]())
}