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



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

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$0()
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此类:val foo = mock[Foo]
  2. 看起来 ScalaMock 不支持部分存根实例,因此您不能g存根方法并期望在调用f时调用它 - 您必须以从另一个类调用Foo.g的方式重组您的代码 - 也许将其包装在委托中。或者使用 Mockito - 它没有那么花哨,并且在运行时发挥了它的魔力,而不是 ScalaMock 的编译时间,但它提供了callRealMethod()模拟类的能力。

基本上,当你mockstub特征而不是类时,ScalaMock 效果最好 - 它们的宏不必处理方法的实际实现,没有人会期望它们这样做。

一个较晚的答案,但由于这是此错误消息的顶级谷歌结果,因此只是添加了另一个需要注意的潜在问题:确保您没有嘲笑final方法。

这将导致相同的错误,而 scalamock 不允许这样做。

如果您拥有代码,只需取消final该方法或以您可接受的其他方式解决它。

相关内容

  • 没有找到相关文章

最新更新