加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

unit-testing – 如何在grails 2.2.4中模拟控制器中的私有方法

发布时间:2020-12-14 16:25:40 所属栏目:大数据 来源:网络整理
导读:我有一个私有方法,使用元类在grails 1.3.7中进行了模拟,但现在我将grails版本升级到2.2.4,同样的模拟失败了. 测试方法有私有方法调用 private def MyPrivateMeth1(def arg1,def arg2) {...} 模拟是这样的 MyController.metaClass.private.MyPrivateMeth1 = {
我有一个私有方法,使用元类在grails 1.3.7中进行了模拟,但现在我将grails版本升级到2.2.4,同样的模拟失败了.

测试方法有私有方法调用

private def MyPrivateMeth1(def arg1,def arg2) {
...
}

模拟是这样的

MyController.metaClass.private.MyPrivateMeth1 = { a,b ->
... 
}

解决方法

尝试使用@TestFor注释,它将为您提供一个控制器变量.然后你可以改变它的元类,以及合并Kamil Mikolajczyk和araxn1d的建议.所以,你的整个测试应该看起来像这样:

@TestFor(MyController) 
class MyControllerTests { 

    setup() {
        controller.metaClass.MyPrivateMeth1 = {def arg1,def arg2 -> 
            //you can make your mocked method return whatever you wish here
            return [key1: "foo",key2: "bar"] 
        }
    }
    void testForSomething() {
        //Some code here that invokes an action or two in your controller which in turn invokes the private method
    }
}

确保你的模拟方法的参数上的def(或String,Long或任何声明)与控制器中的实际私有方法完全相同,或者你的测试将首先尝试使用类的普通私有方法.

这是Spock中的类似测试:

import spock.lang.Specification
import spock.lang.Unroll
import grails.test.mixin.*
import org.junit.*
@TestFor(MyController) 
class MyControllerSpec {

    def "test that thing"() {
        setup:
            controller.metaClass.MyPrivateMeth1 = {def arg1,def arg2 -> return someOutput }
        expect:
            controller.someAction() == expectedRender
        where: 
            someOutput                              | expectedRender
            [key1: "foo",key2: "bar"]              | "expected render from controller"
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读