Unit testing Spock测试框架:mock.getProperty(';name';)与getName()之间的区别
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
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')
}