【问题标题】:Spock test framework: Difference between mock.getProperty('name') vs getName()Spock 测试框架:mock.getProperty('name') 与 getName() 之间的区别
【发布时间】:2017-10-04 05:52:56
【问题描述】:

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() 被调用了。

我知道斯波克不可能这么脆弱。我一定是在什么地方摸索了。那么什么时候应该使用 getName() 以及什么时候使用 getProperty('name')?

【问题讨论】:

    标签: unit-testing spock


    【解决方案1】:

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

    Groovy Mocks 何时应该优于常规 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')
    }
    

    【讨论】:

    • 是的,我正在测试 groovy 代码。感谢您提供有关 GroovyMock 的提示。
    • 不得不说这是一个间歇性问题。 spock 文档对此有这样的说法:“请注意,不必仅仅因为规范和/或模拟类型下的代码是用 Groovy 编写的,就必须使用 Groovy 模拟。除非您有使用 Groovy 模拟的具体理由,更喜欢普通的模拟”。我会尝试使用 GroovyMock,但我不会马上知道它是否能解决问题。
    • 您可以查看github.com/spockframework/spock/blob/master/spock-core/src/main/…,它将getProperty 调用映射到正确的getter 方法,即它将调用标准化为始终在模拟上使用getter。 JavaMockInterceptor 没有这样做。因此,您引用上面的文档中的句子适用and some of the unique Groovy mock features are needed,即Groovy MOP 方法的处理。
    猜你喜欢
    • 2014-08-16
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    相关资源
    最近更新 更多