Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 模拟单元测试中的控制器条件…grails_Java_Hibernate_Grails_Junit_Criteria - Fatal编程技术网

Java 模拟单元测试中的控制器条件…grails

Java 模拟单元测试中的控制器条件…grails,java,hibernate,grails,junit,criteria,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)} ]

在我的控制器中,我有一个操作,它使用条件来命中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\u closure3.docall()适用于参数类型:

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

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

然后,它开始工作。不确定这里的问题是什么。非常感谢您的帮助

这是因为
列表
方法的默认参数

e、 g

可以像这样使用上面的内容:

method(c: {...})
method(params) {...}
method(params, {...}) // this is the same as the above
method(params:new Object[]{...}, c: {...}) // and this also
//etc.
您可以更改
元类
,并添加只接受一个参数的方法
列表

因此,您的
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

将列表修改为列表:{Object params=null,Closure cls->new DomainObj(id:1)}已工作…现在我面临另一个问题。在控制器中有一行result.totalCount,其中result是条件查询的结果。但是测试中的模拟响应只有modCount,因为它只是一个列表。因此它在控制器中的result.totalCount处引发异常。是否有任何方法可以在t中设置totalCountest?@Xeon…我仍然无法在测试用例中模拟分页结果列表。我总是将arraylist作为模拟条件结果,这在控制器中是失败的…我已经在Thank Xeon中解释了问题以及代码。但是如果您能够在新线程中响应,我会很有帮助…再次感谢
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