当被测方法包含闭包时进行 Spock 测试

Spock Testing when method under test contains closure

我正在使用 grails 插件 multi-tenant-single-db。在这种情况下,我需要编写一个 spock 测试,在其中我们暂时删除租户限制。位置是我的租户,所以我的方法是这样的:

def loadOjectDetails(){
       Location.withoutTenantRestriction{
          // code here to retrieve specific items to the object to be loaded
          render( template: "_loadDetails", model:[ ... ]
       }
}

该方法按预期运行,但试图将方法置于测试范围内时,错误输出表明:

groovy.lang.MissingMethodException: No signature of method: com.myPackage.myController.Location.withoutTenantRestriction() is applicable for argument types: 

以及由此而来的堆栈跟踪。

我需要存根吗? withoutTenantRestriction 是我整个方法逻辑的包装器。

更新: 测试代码如下所示:

 given:
    params.id = 3002
    currentUser = Mock(User)
    criteriaSetup()
    controller.getSalesOrder >> salesOrders[2]

    when:
    controller.loadOrderManageDetails()

    then:
    (1.._) controller.springSecurityService.getCurrentUser() >> currentUser


    expect:
    view == 'orderMange/orderManageDetail'
    model.orderInstance == salesOrders[2]

是的!您应该按照在 运行 时间而不是编译时间创建的方式对它进行存根。 你可以像下面这样存根:

Your_Domain.metaClass.withoutTenantRestriction{Closure closure ->
            closure.call()
}

这样您的常规代码就可以在测试用例中运行。此外,在 withoutTenantRestriction 中,它基本上启动了一个新的休眠会话,这并不重要,因为现在您已经关闭了闭包,您可以执行所需的操作来代替仅调用 closure.call()

此外,同样适用于 withThisTenant

在集成测试中,您不需要像加载整个环境那样对其进行存根。

希望对您有所帮助!!