これは、モック オブジェクトを使用するとかなり簡単に実行できます。私は 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 を使用すると、モック オブジェクトのメソッドが呼び出されているかどうかを確認できます。これがここで機能しています。