unit-testing - 了解Grails的mockFor需求

标签 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的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/

相关文章:

python - 为什么测试覆盖率还包括覆盖率报告中的 Flask 依赖项

c# - 如何通过NSubstitute中的父类(super class)匹配参数来 stub 方法?

java - 在 JUnit 中使用 @RunWith 有解决方法吗?

c - 使用链接时替换在单元测试中为结构体创建测试替身

chalice /普惠制 : break out of <g:each>

security - Grails Spring Security LDAP插件:使用LDAP进行身份验证,但仅允许存储在数据库中的用户登录

angularjs - 模拟服务注入(inject) Angular 模块运行 block

java - 在grails中创建用户后无法登录

c# - 使用 EF4 "Code First"和存储库进行单元测试

filesystems - 如何在 go 中模拟/抽象文件系统?