scanalato / grails / unit test / createCriteria.get
-
03-10-2019 - |
Domanda
I può deridere chiamate a:
MyDomainClass.createCriteria().list{
eq('id',id)
eq('anotherParameter',anotherParameterId)
}
con:
def myCriteria = [
list : {Closure cls -> returnThisObject}
]
MyDomainClass.metaClass.static.createCriteria = { myCriteria }
come consigliato a:
http://davistechyinfo.blogspot.com/ 2010/01 / beffardi-hibernate-criteri-in-grails.html
ma per:
MyDomainClass.createCriteria().get{
eq('id',id)
eq('anotherParameter',anotherParameterId)
}
Questo approccio non riesce - forse perché 'ottenere' è una parola chiave in un modo 'list' non è. Qualcuno può consigliare -. Essere in grado di prendere in giro questo in classi di dominio dovrebbe essere possibile, senza semplicemente abbandonare la copertura unit test per i metodi che utilizzano createCriteria().get{}
Suggerimenti molto apprezzato,
Alex
Soluzione
ho trovato una soluzione che non comprometta la mia capacità di unit test di scrittura -
def myCriteria = new Expando();
myCriteria .get = {Closure cls -> returnThisObject}
MyDomainClass.metaClass.static.createCriteria = {myCriteria }
che fa esattamente quello che volevo e supporta potenzialmente testare argomenti forniti. Grazie per l'altra risposta. Spero che questo è utile per gli altri test dominio createCriteria metodi / ().
Altri suggerimenti
Non mi preoccuperei. Invece di creare metodi nella tua classe di dominio e deridere quelli. Che questo rende più facile ma ha soprattutto il vantaggio di mantenere persistenza cui essa appartiene invece di scattering tutto il codice di base:
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)
}
}
}
Poi, nel tuo test, basta deridere come
def testInstances = [...]
MyDomainClass.metaClass.static.findAllByIdAndAnotherParameter = { long id, long id2 ->
return testInstances
}
e
def testInstance = new MyDomainClass(...)
MyDomainClass.metaClass.static.getByIdAndAnotherParameter = { long id, long id2 ->
return testInstance
}
Questo dovrebbe essere molto più semplice ora con il GrailsUnitTestCase.mockDomain
1 metodo.
graal-app / domain / sandbox / graal / foo / Something.groovy
package sandbox.grails.foo
class Something {
String name
}
test / unit / sandbox / graal / 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()
}
}