ScalaMock,意外调用:<mock-1>在测试之间共享模拟实例时

时间:2017-06-13 15:33:47

标签: scala unit-testing testing scalatest scalamock

我将Scala 2.10ScalaMock 3.6一起使用。

我有一个非常简单的测试用例,有4个测试场景。我为这些测试创建了一个mock对象(模仿文件系统):

class ProcessingOperatorTest extends FlatSpec with Matchers with BeforeAndAfterEach with MockFactory {
...

val fakeFS = mock[FileIO]
(fakeFS.createFile _).expects(*).returns(true).anyNumberOfTimes()
(fakeFS.exist _).expects(where { (p: String) => p.contains(existing) }).returns(true).anyNumberOfTimes()
(fakeFS.exist _).expects(where { (p: String) => p.contains(notExisting) }).returns(false).anyNumberOfTimes()

behavior of "Something"
it should "test 1" in {
   ...
}

it should "test 2" in {
   ...
}

it should "test 3" in {
   ...
}

it should "test 4" in {
   ...
}

现在:

  • 第一个测试不使用任何模拟方法(但需要模拟对象)
  • 第二次测试仅使用existing模拟方法
  • 第3次测试同时使用existingnot existing模拟方法
  • 第4次测试使用所有方法,(createFile

现在,出于某种原因,当同时运行所有这些测试时,第4次测试失败,给我以下错误。如果单独运行,它将通过。

Unexpected call: <mock-1> FileIO.exist(notExisting)

Expected:
inAnyOrder {

}

Actual:
  <mock-1> FileIO.exist(notExisting)
ScalaTestFailureLocation: scala.Option at (Option.scala:120)
org.scalatest.exceptions.TestFailedException: Unexpected call: <mock-1> FileIO.exist(notExisting)

...

另一个步骤是将mock声明及其行为复制粘贴到第4 it should { ... }个测试场景中。然后测试工作(分开,一起)。

为什么全局mock实例失败? 如果需要,我可以尝试将类似的测试场景准备为单独的sbt项目。

1 个答案:

答案 0 :(得分:4)

here所述的org.scalatest.OneInstancePerTest混合:

class ProcessingOperatorTest extends FlatSpec
                             with Matchers
                             with BeforeAndAfterEach
                             with MockFactory
                             with OneInstancePerTest {
  ...
}