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

È stato utile?

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

    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top