我收到错误“验证应该在所有受测试代码运行后出现”,并带有以下内容:
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 {}
}
答案 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