模拟单元测试中的控制器标准... grails

时间:2012-07-30 15:36:35

标签: java hibernate grails junit criteria

在我的控制器中,我有一个操作,它使用条件来命中db并获取结果。

def c = DomainObj.createCriteria()
def result =[]
result = c.list(params) {
    'eq'("employerid", id)
    }

我试图在我的单元测试中模仿这个标准。

def mycriteria =[
list: {Closure cls -> new DomainObj(id:1)}
]                                   ]
DomainObj.metaClass.static.createCriteria = {mycriteria}

以上不起作用。它在执行c.list(params)时抛出异常。例外是“groovy.lang.MissingMethodException:没有方法签名:testSearch_closure3.docall()适用于争论类型:

PS-但是,如果我从控制器中的c.list()中删除params,请参见下文:

def c = DomainObj.createCriteria()
    def result =[]
result = c.list() {
    }

然后,它正在发挥作用。不知道这里的问题是什么。任何帮助表示赞赏

1 个答案:

答案 0 :(得分:2)

这是因为list方法的默认参数。

e.g。

def method(Object[] params = {/*no params*/}, Closure c, etc. etc.)  {...}
上面的

可以像:

一样使用
method(c: {...})
method(params) {...}
method(params, {...}) // this is the same as the above
method(params:new Object[]{...}, c: {...}) // and this also
//etc.

您更改metaClass并添加只需一个参数的方法list

所以你的mycriteria应该是这样的:

def mycriteria = [
    list: {Object params=null, Closure cls -> new DomainObj(id:1)}
    //or recreate `list` declaration with all parameters
]
DomainObj.metaClass.static.createCriteria = {mycriteria}

考虑这个例子:

def cl = {String a = 'x', b -> println a +','+ b}
cl("z")

输出是:

x, z

修改

要像以前那样更改返回的对象:

class A {
}

A.metaClass.static.createCriteria = {
    [list: 
        {def a = new A(); a.metaClass.totalResult=5; a}
    ]
}

def c = A.createCriteria()
def result = c.list()
println result.totalResult