3

私は coursera の scala コースに従っており、最後の演習で集合操作を実装するように求められました。私が失敗したテストの 1 つが呼び出されました

exists は forall の観点から実装する必要があります

exists と forall の両方の署名は次のとおりです。

type Set = Int => Boolean

def forall(s: Set, p: Int => Boolean): Boolean = {}
def exists(s: Set, p: Int => Boolean): Boolean = {

   /*should eventually call forall */
}

私は実装を求めているわけではありませんが、scala でそのような単体テストを実行する方法

4

2 に答える 2

3

手始めに私が考えることができる3つの方法があります:

1) 特定の例外をスローするようにモックforallしてから を呼び出しexists、その例外がスローされるかどうかを確認します。

2) コードを実装して を呼び出し、後でが呼び出されexistsたかどうかをテストしますforall

3) scala マクロを使用します。これは、AST を分析し、exists再帰的にチェックして、それが を呼び出すかどうかを確認しますforall

于 2013-10-06T12:21:39.573 に答える
2

これは、モック オブジェクトを使用するとかなり簡単に実行できます。私は Java プロジェクトで Mockito を使用しています。特に Scalatest と一緒に使用すると、Scala からもかなり使いやすくなります。

このコードをproject_dir/build.sbt:

scalaVersion := "2.10.2"

libraryDependencies ++= Seq(
  "org.scalatest" %% "scalatest" % "2.0.M8",
  "org.mockito" % "mockito-core" % "1.9.5"
)

次に、このコードを次の場所に配置しますproject_dir/src/main/test/test.scala

import org.scalatest.{FlatSpec,ShouldMatchers}
import org.scalatest.mock.MockitoSugar

package object test {
  type Set = Int => Boolean
}

package test {
  class Foraller {
    def forall(s: Set, p: Int => Boolean): Boolean = ???
  }

  class Exister(foraller: Foraller) {
    def exists(s: Set, p: Int => Boolean): Boolean = ???  // Fails
    // def exists(s: Set, p: Int => Boolean): Boolean = foraller.forall(s, p)  // Passes
  }

  class Test extends FlatSpec with ShouldMatchers with MockitoSugar {
    "Exister" should "use Foraller in its exists method" in {

      val foraller = mock[Foraller]

      val exister = new Exister(foraller)

      val set: Set = _ == 1
      val pred: Int => Boolean = _ > 0

      exister.exists(set, pred)

      import org.mockito.Mockito._

      verify(foraller).forall(set, pred)
    }
  }
}

sbt test次に、でコマンドを呼び出しproject_dirます。テストが失敗したことがわかるはずです。クラス内の行のコメントを切り替えてExister、もう一度やり直してください。

ここでは、メソッドを提供するクラスのモック オブジェクトを作成し、forallメソッドを提供するクラス内でこのオブジェクトを使用しますexists。Mockito を使用すると、モック オブジェクトのメソッドが呼び出されているかどうかを確認できます。これがここで機能しています。

于 2013-10-06T18:15:10.350 に答える