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

ここには 2 つの問題があります。

  1. オブジェクトを実際にモックすることなく、モックされた回答を確立することはできません: を作成しますval foo = new Foo()が、mock最初にこのクラスを作成する必要があります。val foo = mock[Foo]
  2. ScalaMock は部分的なスタブ化インスタンスをサポートしていないようです。そのため、メソッドをスタブ化gし、呼び出し時に呼び出されることを期待することはできません。別のクラスから呼び出されるf方法でコードを再構築する必要があります。デリゲートでラップします。Foo.g多分。または Mockito を使用してください - ScalaMock のコンパイル時とは対照的に、それほど派手ではなく、実行時にその魔法を行いますがcallRealMethod()、モック化されたクラスに対して機能を提供します。

基本的に、ScalaMock は、クラスではなく、mockユーザーまたはstubトレイトの場合に最適に機能します。それらのマクロは、メソッドの実際の実装を処理する必要がなく、誰も期待していません。

于 2016-06-09T14:35:34.200 に答える