2

私のコントローラーには、基準を使用して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() {
    }

その後、動作しています。ここでの問題が何であるかわからない。どんな助けでも大歓迎です

4

1 に答える 1

2

これは、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.

1つのパラメーターのみを受け取るメソッドを変更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
于 2012-07-30T16:12:53.323 に答える