我正在尝试为我的过滤器编写单元测试,并且我正在努力理解我的模拟对象的需求。这是一个简单的失败测试:
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嘲笑吸气剂。使用需求不起作用,但如果我创建模拟然后设置买方ID(注释行),测试将通过。需求不适用于吸气剂吗?是因为getter是隐式/动态创建的吗?
答案 0 :(得分:4)
方法getBuyerId
必须被嘲笑。 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
被调用两次。