Je teste un service de mon application qui dépend d'un autre service en cours d'exécution. Lors du test, l'injection de dépendance semble ne pas fonctionner. L'injection de dépendances fonctionne-t-elle dans les artefacts Grails lors de l'exécution de tests d'intégration?Injection de dépendances dans les tests d'intégration de Grails
Répondre
Oui, lors de l'exécution de tests (c'est-à-dire ceux du répertoire d'intégration), l'application est démarrée et tous les beans sont créés et injectés comme si l'application était réellement en cours d'exécution. La seule différence entre l'application de test et l'application en cours d'exécution doit être l'environnement de configuration. Bien sûr, si vous instanciez une classe qui nécessite une injection en utilisant l'opérateur 'new' dans votre test, vous n'obtiendrez pas les avantages de DI. Au lieu de cela, créer une propriété dans votre test pour le grain de vos tests et il sera injecté:
class MyServiceTests extends GrailsUnitTestCase {
MyService service
void testInjection() {
assertNotNull service
}
}
Pour ceux utilisant Grails 1.3.7, j'ai trouvé que vous ne pouvez pas utiliser le nom de classe afin que l'injection de dépendances fonctionne. Au lieu de cela, déclarez le service comme:
def myService
puis la DI se produit. Avec le code ci-dessus dans 1.3.7 l'assertion non nulle échouerait.
1.3.7 et supérieur. C'est aussi un problème dans 2.4.x. De plus, pour les tests d'intégration du contrôleur, vous devez instancier le contrôleur: 'def fooController = new FooController()' - alors les dépendances seront correctement câblées. –
Merci. Je teste un service qui dépend des autres services et je l'instanciais et à cause de cela, je n'obtenais pas les avantages de DI. – Lucas
Juste une note de côté. Les tests d'intégration ne doivent pas prolonger GrailsUnitTestCase en fonction de la version, ce qui peut entraîner de graves problèmes avec votre ConfigurationHolder.config étant null. Oui grails create-integration-test dans de nombreuses versions crée un test qui étend GrailsUnitTestCase mais c'est un bug qui a été corrigé récemment. –
Pourquoi la réponse dit-il "Bien sûr, si vous instanciez une classe qui nécessite une injection", vous n'obtiendrez pas DI? Pourquoi est-ce généralement le cas? Ce n'était pas évident pour moi - bien que je l'ai douloureusement compris. –