理解Grails mockFor demand

时间:2014-04-25 19:54:36

标签: unit-testing grails mocking

我正在尝试为我的过滤器编写单元测试,并且我正在努力理解我的模拟对象的需求。这是一个简单的失败测试:

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是隐式/动态创建的吗?

1 个答案:

答案 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将被调用1到2次(第一次打印时,第二次在块中)。默认情况下,如果未指定任何内容,则假定该方法将被调用一次,在这种情况下将失败,因为getBuyerId被调用两次。
  • 我们还可以在测试完成后验证模拟控件是否完成了它的工作