代码之家  ›  专栏  ›  技术社区  ›  Macoshark

Spock测试框架:模拟之间的差异。getProperty('name')与getName()

  •  3
  • Macoshark  · 技术社区  · 8 年前

    假设我有以下课程

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

    1 回复  |  直到 8 年前
        1
  •  0
  •   Leonard Brünings    8 年前

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

    当规范下的代码用Groovy编写时应使用 并且需要一些独特的Groovy模拟特性。调用时 从Java代码来看,Groovy模拟的行为将类似于常规模拟。请注意 仅仅因为代码在 规范和/或模拟类型是用Groovy编写的。除非你有

    在本例中,您(或您的代码)正在使用Groovy的一些特殊功能,即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')
    }