Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing Spock测试框架:mock.getProperty(';name';)与getName()之间的区别_Unit Testing_Spock - Fatal编程技术网

Unit testing Spock测试框架:mock.getProperty(';name';)与getName()之间的区别

Unit testing Spock测试框架:mock.getProperty(';name';)与getName()之间的区别,unit-testing,spock,Unit Testing,Spock,getProperty('name')和getName()在模拟实例中有什么区别?我以为他们的意思是一样的,但我不得不在他们之间交换,因为有时候斯波克对其中一个不满意 假设我有下面的课程 class Person { String name } 我正在测试另一个类,该类用于更新人员,所以我做了如下操作: void "test something"() { Person personMock = Mock(Person) when: someObject.upd

getProperty('name')和getName()在模拟实例中有什么区别?我以为他们的意思是一样的,但我不得不在他们之间交换,因为有时候斯波克对其中一个不满意

假设我有下面的课程

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

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

什么时候Groovy模拟应该比常规模拟更受欢迎?Groovy模拟 当规范下的代码是用Groovy编写时应该使用 还需要一些独特的Groovy模拟特性。被叫的时候 从Java代码来看,Groovy模拟的行为将类似于常规模拟。注意 仅仅因为下面的代码 规范和/或模拟类型是用Groovy编写的。除非你有 使用Groovy模拟的具体原因是,更喜欢常规模拟

在本例中,您(或您的代码)正在使用Groovy的一些特殊功能,即Groovy MOP方法
getProperty
GroovyMock
使用处理这些特殊方法的,例如,将
getProperty('x')
规范化为
getX()


是的,我正在测试groovy代码。谢谢你给我关于GroovyMock的提示。我不得不告诉你,因为这是一个间歇性的问题。spock文档对此有这样的说法:“请注意,仅仅因为规范和/或模拟类型下的代码是用Groovy编写的,就没有必要使用Groovy模拟。除非您有具体理由使用Groovy模拟,否则最好使用常规模拟”。我将尝试使用GroovyMock,但我现在不知道它是否解决了问题。您可以查看which将
getProperty
调用映射到正确的getter方法,也就是说,它将调用规范化,以便始终在mock上使用getter。这不是由
JavaMockInterceptor
完成的。因此,上面引用的文档中的句子适用于
,并且需要一些独特的Groovy模拟特性
,即Groovy MOP方法的处理。
void "test something"() {
    Person personMock = GroovyMock(Person)

    when:
    someObject.updatePersonName(personMock, 'new name')

    then:
    1 * personMock.getName() >> 'old name'
    1 * personMock.setName('new name')
}