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" } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |