嘿,我正在尝试测试以下类:
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"
我在这里看到两个问题:
- 如果不实际模拟对象,就无法建立模拟答案:您创建
val foo = new Foo()
,但您必须先mock
此类:val foo = mock[Foo]
- 看起来 ScalaMock 不支持部分存根实例,因此您不能
g
存根方法并期望在调用f
时调用它 - 您必须以从另一个类调用Foo.g
的方式重组您的代码 - 也许将其包装在委托中。或者使用 Mockito - 它没有那么花哨,并且在运行时发挥了它的魔力,而不是 ScalaMock 的编译时间,但它提供了callRealMethod()
模拟类的能力。
基本上,当你mock
或stub
特征而不是类时,ScalaMock 效果最好 - 它们的宏不必处理方法的实际实现,没有人会期望它们这样做。
一个较晚的答案,但由于这是此错误消息的顶级谷歌结果,因此只是添加了另一个需要注意的潜在问题:确保您没有嘲笑final
方法。
这将导致相同的错误,而 scalamock 不允许这样做。
如果您拥有代码,只需取消final
该方法或以您可接受的其他方式解决它。