質問

電話をかけることができます:

MyDomainClass.createCriteria().list{
    eq('id',id)
    eq('anotherParameter',anotherParameterId)
}

と:

def myCriteria = [
    list : {Closure  cls -> returnThisObject}
]
MyDomainClass.metaClass.static.createCriteria = { myCriteria }

アドバイスされたとおり:

http://davistechyinfo.blogspot.com/2010/01/mocking-hibernate-criteria-in-grails.html

しかし、:

MyDomainClass.createCriteria().get{
    eq('id',id)
    eq('anotherParameter',anotherParameterId)
}

このアプローチは失敗します - 「get」は「 'fist'がそうではない方法のキーワードであるためかもしれません。誰でもアドバイスできますか - ドメインクラスでこれをock笑することができるはずです。 createCriteria().get{}.

提案は大歓迎です、

アレックス

役に立ちましたか?

解決

ユニットテストを書く能力を妥協しないソリューションを見つけました -

def myCriteria = new Expando();
myCriteria .get = {Closure  cls -> returnThisObject}         
MyDomainClass.metaClass.static.createCriteria = {myCriteria }

これは私が望んでいたことを正確に行い、テストの提供された議論をサポートする可能性があります。他の回答をありがとう。これが他の人に役立つことを願っています。ドメイン/createCriteria()メソッドをテストします。

他のヒント

気にしないだろう。代わりに、ドメインクラスにメソッドを作成し、それらをock笑します。これにより、テストが容易になりますが、さらに重要なことには、コードベース全体に散乱する代わりに、持続性を維持するという利点があります。

class MyDomainClass {
   String foo
   int bar

   static MyDomainClass findAllByIdAndAnotherParameter(long id, long anotherParameterId) {
      createCriteria().list {
         eq('id',id)
         eq('anotherParameter',anotherParameterId)
      }
   }

   static MyDomainClass getByIdAndAnotherParameter(long id, long anotherParameterId) {
      createCriteria().get {
         eq('id',id)
         eq('anotherParameter',anotherParameterId)
      }
   }
}

次に、テストで、それをock笑してください

def testInstances = [...]
MyDomainClass.metaClass.static.findAllByIdAndAnotherParameter = { long id, long id2 ->
   return testInstances
}

def testInstance = new MyDomainClass(...)
MyDomainClass.metaClass.static.getByIdAndAnotherParameter = { long id, long id2 ->
   return testInstance
}

これは今でははるかに簡単になるはずです GrailsUnitTestCase.mockDomain1 方法。

grails-app/domain/sandbox/grails/foo/something.groovy

package sandbox.grails.foo

class Something {
    String name
}

テスト/ユニット/サンドボックス/グレイル/foo/shonetests.groovy

package sandbox.grails.foo

import grails.test.mixin.*
import org.junit.*

@TestFor(Something)
class SomethingTests {

    void testSomething() {

        mockDomain(Something, [
            new Something(name: 'Foo'),
            new Something(name: 'Bar'),
            new Something(name: 'Boo'),
            new Something(name: 'Baz')
        ])

        def actuals = Something.createCriteria().list(sort: 'name', order: 'asc') {
            like('name', '%oo')
        }

        assertEquals 2, actuals.size()

    }
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top