2010-02-16 12 views

Odpowiedz

8

Tak, podczas uruchamiania testów (np. W katalogu integracji) aplikacja jest uruchamiana, a wszystkie komponenty bean są tworzone i wstrzykiwane tak, jakby aplikacja była faktycznie uruchomiona. Jedyną różnicą między aplikacją testową a uruchomioną aplikacją powinno być środowisko konfiguracyjne.

Oczywiście, jeśli utworzysz klasę wymagającą wstrzyknięcia za pomocą "nowego" operatora w teście, nie uzyskasz korzyści z DI. Zamiast tworzyć nieruchomość w Twoim przypadku testowego dla fasoli swoje badania i będzie wstrzykiwany:

class MyServiceTests extends GrailsUnitTestCase { 

    MyService service 

    void testInjection() { 
     assertNotNull service 
    } 
} 
+0

Dzięki. Testuję usługę, która zależy od usług innych i ja ją tworzyłem i dlatego nie otrzymałem korzyści z DI. – Lucas

+2

Tylko notatkę. Testy integracyjne nie powinny rozszerzać GrailsUnitTestCase w zależności od wersji, co może powodować poważne problemy z ustawieniem ConfigurationHolder.config jako wartością null. Yes Grails create-integration-test w wielu wersjach tworzy test rozszerzający GrailsUnitTestCase, ale jest to błąd, który został naprawiony w ostatnim czasie. –

+0

Dlaczego odpowiedź brzmi "Oczywiście, jeśli utworzysz klasę wymagającą iniekcji", nie otrzymasz DI? Dlaczego tak się dzieje? Nie było to dla mnie oczywiste - choć boleśnie to rozgryzłem. –

4

Dla tych z Was, używając Grails 1.3.7, znalazłem, że nie można użyć nazwy klasy w celu uzyskania działania Injection Dependency Injection. Zamiast tego, deklaruj usługę jako:

def myService 

, a następnie dzieje się magia DI. W przypadku powyższego kodu w wersji 1.3.7 nieudana asercja zakończy się niepowodzeniem.

+0

1.3.7 i więcej. Jest to również problem w 2.4.x. Dodatkowo w przypadku testów integracji kontrolera należy utworzyć instancję kontrolera: 'def fooController = new FooController()' - wtedy zależności będą poprawnie podłączone. –

Powiązane problemy