2010-02-16 8 views
6

Sto testando un servizio della mia applicazione che dipende da altri servizi in fase di esecuzione. Durante il test, sembra che la dipendenza iniettata non funzioni. L'iniezione di dipendenza funziona negli artefatti di Grails durante l'esecuzione dei test di integrazione?Iniezione di dipendenza nei test di integrazione di Grails

risposta

8

Sì, durante l'esecuzione dei test (ovvero quelli nella directory di integrazione), l'applicazione viene avviata e tutti i bean vengono creati e iniettati come se l'app fosse effettivamente in esecuzione. L'unica differenza tra l'app di test e l'app in esecuzione dovrebbe essere l'ambiente di configurazione.

Ovviamente, se si istanzia una classe che richiede l'iniezione utilizzando l'operatore 'nuovo' nel test, non si otterranno i vantaggi di DI. Invece, creare una proprietà nel vostro banco di prova per il bean vostra prova e sarà iniettato:

class MyServiceTests extends GrailsUnitTestCase { 

    MyService service 

    void testInjection() { 
     assertNotNull service 
    } 
} 
+0

Grazie. Sto testando un servizio che dipende dai servizi di anothers e lo stavo istanziando e per questo motivo non ho avuto i benefici di DI. – Lucas

+2

Solo una nota a margine. I test di integrazione non dovrebbero estendere GrailsUnitTestCase a seconda della versione, questo può causare seri problemi con ConfigurationHolder.config che è null. Sì grails create-integration-test in molte versioni crea un test che estende GrailsUnitTestCase ma questo è un bug che è stato corretto di recente. –

+0

Perché la risposta dice "Certo, se istanziate una classe che richiede l'iniezione" non otterrete DI? Perché è generalmente il caso? Non era ovvio per me, anche se l'ho risolto dolorosamente. –

4

Per quelli di voi che usano Grails 1.3.7, ho scoperto che non è possibile utilizzare il nome della classe al fine di far funzionare la dipendenza da iniezione. Invece, dichiarare il servizio come:

def myService 

e quindi avviene la DI magia. Con il codice precedente in 1.3.7 l'affermazione non nulla fallirebbe.

+0

1.3.7 e versioni successive. Questo è un problema anche in 2.4.x. Inoltre, per i test di integrazione del controller è necessario istanziare il controller: 'def fooController = new FooController()' - quindi le dipendenze saranno cablate correttamente. –

Problemi correlati