0

我收到错误“验证应该在所有被测代码都被执行后出现”,如下所示:

class CowTest extends MockFactory {

  Cow.init(testCowProcesses)

  @Test
  def noProcessesTest: Unit = {
    val cow: Cow = Cow(testCowProcesses)
    cow.simulateOneDay(0 nanoseconds)
  }


  @Test
  def processSimulationTest: Unit = {
    val NUMBER_OF_TRIES: Int = 10
    val cow: Cow = Cow(testCowProcesses)
    for (ii <- 0 until NUMBER_OF_TRIES) {
      cow.simulateOneDay(0 nanoseconds)
    }
    (cow.metabolicProcess.simulateOneDay _).verify(0 nanoseconds).repeated(NUMBER_OF_TRIES)
  }
}

testCowProcesses在另一个文件中定义,如下所示(缩写):

object CowTesters extends MockFactory {
  val metProc = stub[MetabolicProcess]
  (metProc.replicate _).when().returns(metProc)

  val testCowProcesses = CowProcesses(metProc)

}

我不太明白错误信息。如果我注释掉这一verify行,测试就会运行。或者,如果我注释掉第一个测试,则可以运行第二个测试。测试类中没有其他测试。这似乎表明存根对象不能被重用,因为它们在 mockito 中(我正在改编来自 mockito 的代码)。

重新实例化模拟对象的最佳解决方案是,也许通过转换CowTestersclass?

编辑:

我确认了上述建议有效(不确定它是否是最好的),但同时我做了一些更复杂的事情来让我通过编译:

//TODO: once all tests are converted to ScalaMock, 
//TODO: just make this a class with a companion object
trait CowTesters extends MockFactory {
  val metProc = stub[MetabolicProcess]
  (metProc.replicate _).when().returns(metProc)

  val testCowProcesses = CowProcesses(metProc)
}
object CowTesters extends CowTesters {
  def apply(): CowTesters = new CowTesters {}
}
4

1 回答 1

1

从上面的代码中,您似乎正在尝试使用 JUnit 或 TestNG。ScalaMock 不直接支持这些框架中的任何一个,这就是您在验证模拟时苦苦挣扎的原因。您需要使用 ScalaTest 或 Specs2 来实现您的测试。见http://scalamock.org/user-guide/integration/

如果您切换到例如 FunSuite,从 JUnit 到 ScalaTest 的转换应该非常简单:http ://www.scalatest.org/user_guide/selecting_a_style

于 2017-10-28T06:26:51.220 回答