Spock 测试框架:mock.getProperty('name') 与 getName() 之间的区别
Spock test framework: Difference between mock.getProperty('name') vs getName()
getProperty('name') 与 getName() 之间的模拟实例有何区别?我以为他们的意思是一样的,但我一直不得不在他们之间交换,因为有时 spock 对其中一个不满意。
假设我有以下 class
class Person {
String name
}
我正在测试一些其他的 class 来更新这个人,所以我做这样的事情:
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')?
奇怪的是你的代码触发器,但是如果你正在测试 Groovy 代码那么你应该使用 GroovyMock
而不是 Mock
(另见 docs ),它对 Groovy 的某些特殊功能提供额外支持。
When Should Groovy Mocks be Favored over Regular Mocks? Groovy mocks
should be used when the code under specification is written in Groovy
and some of the unique Groovy mock features are needed. When called
from Java code, Groovy mocks will behave like regular mocks. Note that
it isn’t necessary to use a Groovy mock merely because the code under
specification and/or mocked type is written in Groovy. Unless you have
a concrete reason to use a Groovy mock, prefer a regular mock.
在这种情况下,您(或您的代码)正在使用 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')
}
getProperty('name') 与 getName() 之间的模拟实例有何区别?我以为他们的意思是一样的,但我一直不得不在他们之间交换,因为有时 spock 对其中一个不满意。
假设我有以下 class
class Person {
String name
}
我正在测试一些其他的 class 来更新这个人,所以我做这样的事情:
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')?
奇怪的是你的代码触发器,但是如果你正在测试 Groovy 代码那么你应该使用 GroovyMock
而不是 Mock
(另见 docs ),它对 Groovy 的某些特殊功能提供额外支持。
When Should Groovy Mocks be Favored over Regular Mocks? Groovy mocks should be used when the code under specification is written in Groovy and some of the unique Groovy mock features are needed. When called from Java code, Groovy mocks will behave like regular mocks. Note that it isn’t necessary to use a Groovy mock merely because the code under specification and/or mocked type is written in Groovy. Unless you have a concrete reason to use a Groovy mock, prefer a regular mock.
在这种情况下,您(或您的代码)正在使用 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')
}