10


4

groovy / grails /単体テスト/ createCriteria.get

呼び出しをモックできます:

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

と:

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

で助言されたように:

しかし:

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

このアプローチは失敗します-「get」は「リスト」ではない方法のキーワードだからかもしれません。 誰でもアドバイスできます-`createCriteria()。get {}`を使用するメソッドのユニットテストカバレッジを単純に放棄することなく、ドメインクラスでこれをモックできることは可能です。

提案は大歓迎、

Alex

3 Answer


14


単体テストを書く能力を損なわないソリューションを見つけました-

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

これはまさに私が望んでいたことを行い、提供された引数のテストを潜在的にサポートします。 他の回答をありがとう。 これがdomain / createCriteria()メソッドをテストする他の人に役立つことを願っています。


5


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

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)
      }
   }
}

次に、テストで、次のようにモックします。

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

and

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


1


これは、 `GrailsUnitTestCase.mockDomain`http://grails.org/doc/latest/guide/single.html#9.1%20Unit%20Testing [1]メソッドを使用すると、はるかに簡単になります。

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

package sandbox.grails.foo

class Something {
    String name
}

test / unit / sandbox / grails / foo / SomethingTests.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()

    }
}