在 scala 中模拟生成 java.lang.NoSuchMethodException

Mocking in scala generates a java.lang.NoSuchMethodException

嘿,我正在尝试测试以下 class :

class Foo {
 def f: Int = 4 + g

 def g: Int = 2
}

我的测试如下:

class FooSpec extends PlaySpec with MockFactory {
  val foo = new Foo()
  "Foo" must {
    "Call function f" in {
        (foo.g _)
        .expects()
        .once()
        .returns(5)

        foo.f must be (9)
     }
   }
}

我的测试失败说:

java.lang.NoSuchMethodException: Foo.mock$g[=13=]()
java.lang.Class.getMethod(Unknown Source)
...

我不确定为什么...

我正在使用 scalatest 和 scalamock :

"org.scalatestplus.play" %% "scalatestplus-play" % "1.5.0" % "test"
"org.scalamock" %% "scalamock-scalatest-support" % "3.2.2" % "test"

我在这里看到两个问题:

  1. 如果不实际模拟对象就无法建立模拟答案:您创建 val foo = new Foo(),但您必须先 mock 这个 class:val foo = mock[Foo]
  2. 看起来 ScalaMock 不支持部分存根实例,所以你不能存根方法 g 并期望它在你调用 f 时被调用 - 你将不得不重组你的代码以 Foo.g 从另一个 class 调用的方式 - 也许将其包装在委托中。或者使用 Mockito - 与 ScalaMock 的编译时间相比,它并不那么花哨并且在运行时发挥它的魔力,但它提供了 callRealMethod() 在模拟 class.
  3. 上的能力

基本上 ScalaMock 在 mockstub traits 时效果最好,而不是 classes - 它们的宏不必处理方法的实际实现,没有人会期望他们。