Spock测试框架:mock.getProperty(' name')vs getName()

时间:2017-10-04 05:52:56

标签: unit-testing spock

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')?

1 个答案:

答案 0 :(得分:0)

您的代码触发器很奇怪,但是如果您正在测试Groovy代码,那么您应该使用GroovyMock代替Mock(另请参阅docs),它还有额外的支持对于Groovys的一些特殊功能。

  什么时候Groovy Mocks应该受到常规模拟的青睐? Groovy嘲笑   当使用Groovy编写规范下的代码时,应该使用它   并且需要一些独特的Groovy模拟功能。什么时候叫   从Java代码开始,Groovy模拟就像常规模拟一样。注意   没有必要仅仅因为代码下使用Groovy模拟   规范和/或模拟类型是用Groovy编写的。除非你有   使用Groovy模拟的一个具体原因,更喜欢常规模拟。

在这种情况下,您(或您的代码)正在使用Groovys的一些特殊功能,即Groovy MOP方法getPropertyGroovyMock使用处理这些特殊方法的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')
}