我正在尝试为我的过滤器编写单元测试,并且我正在努力理解我的模拟对象的需求。这是一个简单的失败测试:
void "test my sanity"() {
setup:
def vendorPayment = mockFor(Payment)
vendorPayment.demand.buyerId { -> 123}
def vp = vendorPayment.createMock()
//vp.buyerId=123
println "buyer id: ${vp.buyerId}"
when:
def a = "testing"
then:
vp.buyerId == 123
}
我想模拟buyerId的getter。使用需求不起作用,但如果我创建模拟然后设置买家 ID(注释行),测试就会通过。需求不适用于 setter/getter 吗?是因为 getter 是隐式/动态创建的吗?
最佳答案
方法getBuyerId
必须被 mock 。 Groovy 在编译时为您添加访问器方法,因此必须模拟按需方法。以这个简单的例子为例:
class Payment {
Integer buyerId
}
Payment.groovy
的 getter/setter编译后类转换为字节码时会添加。相应的测试如下所示:
void "test my power"() {
setup:
def vendorPayment = mockFor(Payment)
vendorPayment.demand.getBuyerId(1..2) { -> 123}
def vp = vendorPayment.createMock()
println "buyer id: ${vp.buyerId}"
expect:
vp.buyerId == 123
//This would fail for < 2.3.* because of this bug which is fixed in 2.4
//http://jira.grails.org/browse/GRAILS-11075
vendorPayment.verify() //null
}
注意所做的更改:
-
getBuyerId
方法被模拟而不是字段buyerId
- 测试要求 getBuyerId 将被调用 1 到 2 次(第一次在打印时,第二次在 then block 中)。默认情况下,如果未指定任何内容,则假定该方法将被调用一次,在这种情况下将失败,如
getBuyerId
被调用两次。 - 我们还可以在测试完成后验证模拟控件是否完成了其工作
关于unit-testing - 了解Grails的mockFor需求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23301840/