使用模拟对象很容易做到这一点。我在我的 Java 项目中使用 Mockito,它在 Scala 中也非常有用,尤其是与 Scalatest 一起使用。
将此代码放入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 允许验证是否调用了某个模拟对象上的某个方法,这就是这里的工作原理。