Groovy / Grails / unit Testing / CreateCriteria.get
-
03-10-2019 - |
質問
電話をかけることができます:
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.mockDomain
1 方法。
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()
}
}
所属していません StackOverflow