在我的控制器中,我有一个操作,它使用标准来命中数据库并获取结果。
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()中删除参数,即参见以下内容:
def c = DomainObj.createCriteria()
def result =[]
result = c.list() {
}
然后,它开始发挥作用。不确定这里的问题是什么。任何帮助都将不胜感激
这是因为list
方法的默认参数。
例如
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