2

嘿,我正在尝试测试以下课程:

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"
4

1 回答 1

5

我在这里看到两个问题:

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

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

于 2016-06-09T14:35:34.200 回答