验证最后一次时,如何更正“验证所有代码在运行后是否应出现验证?”

时间:2017-10-26 20:12:08

标签: scalamock

我收到错误“验证应该在所有受测试代码运行后出现”,并带有以下内容:

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的代码)。

是重新设置模拟对象的最佳解决方案,可能是将CowTesters转换为class吗?

修改

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

//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 {}
}

1 个答案:

答案 0 :(得分:1)

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

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