【发布时间】:2017-01-27 22:58:53
【问题描述】:
我想在 Scala 中设置一个测试,创建一个模拟配置来提供某些值。我正在使用 ScalaTest 3.0.1、ScalaMock 3.4.2、 和类型安全的 1.3.1。目标是在运行测试之前模拟配置的值。文档位于 http://www.scalatest.org/user_guide/testing_with_mock_objects 和 http://scalamock.org/user-guide/features/ 似乎提供 几个选项。首先,这是一些目标代码:
import com.typesafe.config.Config
class Sample(config: Config) {
private val aValue = config.getDouble("aValue")
}
似乎应该可以一次设置所有内容,或者在每次测试之前设置所有内容。此尝试失败:
class SampleSpec extends FlatSpec with MockFactory with BeforeAndAfterAll {
private val mockConfig = mock[Config]
override def beforeAll {
(mockConfig.getDouble _).expects("aValue").returning(1.0).anyNumberOfTimes()
}
"testOne" should "return 1" in {
new Sample(mockConfig)
}
"testTwo" should "return 1" in {
new Sample(mockConfig)
}
}
第一次测试成功,但夹具中的第二次测试失败,并产生此错误:
Unexpected call: <mock-1> Config.getDouble(aValue)
Expected:
inAnyOrder {
}
Actual:
<mock-1> Config.getDouble(aValue)
ScalaTestFailureLocation: scala.Option at (Option.scala:120)
org.scalatest.exceptions.TestFailedException: Unexpected call: <mock-1> Config.getDouble(aValue)
Expected:
inAnyOrder {
}
这是另一种方法:
class SampleSpec extends FlatSpec with MockFactory with BeforeAndAfter {
private val mockConfig = mock[Config]
before {
(mockConfig.getDouble _).expects("aValue").returning(1.0)
}
"testOne" should "return 1" in {
new Sample(mockConfig)
}
"testTwo" should "return 1" in {
new Sample(mockConfig)
}
}
它会产生这个异常:
An exception or error caused a run to abort: assertion failed: Null expectation context - missing withExpectations?
java.lang.AssertionError: assertion failed: Null expectation context - missing withExpectations?
为什么第一次尝试失败?测试指定getDouble 可以被调用任意次数,但第二次
测试失败,就像没有使用 anyNumberOfTimes() 一样。应该如何编码,以便可以模拟一次该方法并且
反复调用?为什么第二次尝试失败?有没有办法重置模拟以便重复使用?
【问题讨论】: