使用“按名称调用”参数模拟方法时,不会调用“answers”

`answers` is not invoked when mocking a method with `call-by-name` parameter

有一个classInvokeLater,定义是这样的:

class InvokeLater {
    def apply(f: => Any): Unit = { 
       // do something ...
       f 
       // do some other thing
    }
}

在规格测试中,我嘲笑它:

val invokeLater = mock[InvokeLater]
invokeLater.apply(any) answers { f => f:Unit }

但似乎 answers 中的代码从未运行过。

specs2 现在支持这个功能吗?

首先,您需要确保 specs2-mock.jar 位于类路径中的 mockito.jar 之前。然后注意传递给answers方法的f是一个Function0。例如

class InvokeLater {
  def apply(f: =>Int): Unit = {
    // do something ...
    f
    // do some other thing
  }
}

val invokeLater = mock[InvokeLater]

invokeLater.apply(any) answers { f =>
  println("got the value "+f.asInstanceOf[Function0[Int]]())
}

invokeLater.apply(1)

这会打印:

got the value 1