getProperty(' name')与getName()之间的模拟实例有什么区别?我认为他们的意思相同,但我不得不在他们之间交换,因为有时spock对其中一个不满意。
我们说我有以下课程
class Person {
String name
}
我正在测试其他一些旨在更新此人的课程,所以我做了类似的事情:
void "test something"() {
Person personMock = Mock(Person)
when:
someObject.updatePersonName(personMock, 'new name')
then:
1 * personMock.getName() >> 'old name'
1 * personMock.setName('new name')
}
简化测试的细节并不重要。关键是我正在验证是否正在读取和更新某个属性。有时,当我运行测试时,我得到的投诉是,从未调用过personMock.getName(),它有助于显示调用了personMock.getProperty(' name')。如果我重写它以使用该表单,则测试通过。直到一段时间之后它再次抱怨getProperty(' name')没有被调用但是getName()是。
我知道spock可能不会这样。我一定在某个地方摸索过。那么我什么时候应该使用getName()和getProperty(' name')?
答案 0 :(得分:0)
您的代码触发器很奇怪,但是如果您正在测试Groovy代码,那么您应该使用GroovyMock
代替Mock
(另请参阅docs),它还有额外的支持对于Groovys的一些特殊功能。
什么时候Groovy Mocks应该受到常规模拟的青睐? Groovy嘲笑 当使用Groovy编写规范下的代码时,应该使用它 并且需要一些独特的Groovy模拟功能。什么时候叫 从Java代码开始,Groovy模拟就像常规模拟一样。注意 没有必要仅仅因为代码下使用Groovy模拟 规范和/或模拟类型是用Groovy编写的。除非你有 使用Groovy模拟的一个具体原因,更喜欢常规模拟。
在这种情况下,您(或您的代码)正在使用Groovys的一些特殊功能,即Groovy MOP方法getProperty
。 GroovyMock
使用处理这些特殊方法的GroovyMockInterceptor,例如,将getProperty('x')
规范化为getX()
。
void "test something"() {
Person personMock = GroovyMock(Person)
when:
someObject.updatePersonName(personMock, 'new name')
then:
1 * personMock.getName() >> 'old name'
1 * personMock.setName('new name')
}