对于模拟对象的记录存根是有效的。我添加了简单的
Person
和
PersonHelper
向示例初始化,测试通过:
import spock.lang.Specification
class ExampleSpec extends Specification {
def "should return second value of list of return values"() {
given:
Person personBob = Mock()
Person personJackson = Mock()
PersonHelper stubbedPerson = Stub()
stubbedPerson.getNameOfBrother(personBob) >> "Billy Bob";
stubbedPerson.getNameOfBrother(personJackson) >> "Tommy Jackson";
when:
String actual = stubbedPerson.getNameOfBrother(personBob)
String actual2 = stubbedPerson.getNameOfBrother(personJackson)
then:
actual == "Billy Bob" // true
actual2 == "Tommy Jackson" // false "Billy Bob"
}
static class Person {
String name
}
static class PersonHelper {
String getNameOfBrother(Person person) {
return null
}
}
}
我查过了
spock-core:1.1-groovy-2.4
我是说,
spock-core:1.0-groovy-2.4
甚至
spock-core:0.7-groovy-2.0
是的。一切顺利。
但更重要的是-
这样的测试毫无意义
是的。你根本不测试你的代码。只测试模拟框架是否正确模拟。如果在生产代码中使用spock mock,这个测试可能会有一些意义,但这不是一个有效的假设。
可能出什么问题?
想一想这个测试。根据你的
when:
阻止你试图测试
PersonHelper.getNameOfBrother(Person person)
为两个不同的对象返回兄弟的有效名称。现在让我们假设这是对
个人助手
在你的项目中上课。想象一下如果突然实现
getNameOfBrother
方法开始抛出
NullPointerException
因为一些随机的原因。扪心自问-你的单元测试能保护你不受这种情况的影响吗?不。你的测试总是通过的,因为你正在破坏你正在测试的方法。如果您测试一个真正的实现,而您通过了一个真正的
人
对象,则会通知您
空指针异常
在测试中。否则,当您部署代码时,您将看到它,而某些用户的操作调用此方法时,它将失败。