我正在尝试使用 Specs2 和 Mockito 测试一些 Scala 代码。我对这三个人都比较陌生,并且对返回 null 的模拟方法有困难。
在以下(转录有一些名称更改)
"My Component's process(File)" should {
"pass file to Parser" in new modules {
val file = mock[File]
myComponent.process(file)
there was one(mockParser).parse(file)
}
"pass parse result to Translator" in new modules {
val file = mock[File]
val myType1 = mock[MyType1]
mockParser.parse(file) returns (Some(myType1))
myComponent.process(file)
there was one(mockTranslator).translate(myType1)
}
}
“将文件传递给解析器”一直有效,直到我在 SUT 中添加了翻译器调用,然后因为该mockParser.parse
方法返回了一个 null,而翻译器代码不能接受这个 null。
同样,“将解析结果传递给 Translator”直到我尝试在 SUT 中使用翻译结果。
这两种方法的真实代码永远不会返回 null,但我不知道如何告诉 Mockito 让期望返回可用的结果。
我当然可以通过在 SUT 中进行空检查来解决这个问题,但我宁愿不这样做,因为我确保永远不会返回空值,而是使用Option
,None
和Some
.
指向一个好的 Scala/Specs2/Mockito 教程的指针会很棒,还有一个简单的例子来说明如何改变一行
there was one(mockParser).parse(file)
当它不处理空值时,使其返回允许在 SUT 中继续执行的东西。
试图弄清楚这一点,我试图将那条线改为
there was one(mockParser).parse(file) returns myResult
myResult 的值是我想要返回的类型。这给了我一个编译错误,因为它希望在MatchResult
那里找到一个而不是我的返回类型。
如果重要的话,我使用的是 Scala 2.9.0。