2016-07-28 24 views
1

Ich versuche, einen Integrationstest für einen Service zu schreiben, der eine Frühlingsbohne injiziert hat. Die Frühlingsbohne ist in resources.groovy definiert. Die Bean, die mein Dienst verwendet, scheint in meinem Integrationstest nicht injiziert zu werden, wird aber bei der Ausführung von grails run-app ordnungsgemäß in das Programm injiziert.Injection Spring Beans von resources.groovy in Integrationstest für einen Grails 3 Service

Hier ist ein minimal Fehler Beispiel:

grails-app/conf/spring/resources.groovy

beans = { 
    myBean(Object){} 
} 

grails-app/services/MyService.groovy

class MyService { 
    def myBean 

    def serviceMethod(){ 
    myBean.class.simpleName 
    } 
} 

grails-app/src/integration-test/groovy/MyServiceSpec.groovy

@Integration 
class MyServiceSpec extends Specification { 
    def myService 

    when: 
    def myBean = myService.myBean 

    then: 
    myBean != null 
} 

Grails Version Info:

$ grails -v 
| Grails Version: 3.1.9 
| Groovy Version: 2.4.7 
| JVM Version: 1.8.0_92 

Update:

Frühling scheint ganz gut andere Dienste zu injizieren. Wenn ich innerhalb MyService einen anderen Dienst deklariere, wird es injiziert.

class MyService { 
    def myBean 
    def myOtherService 

    def serviceMethod(){ 
    myBean.class.simpleName 
    } 
} 
+0

Integration sollte nicht wie das, was Sie haben, aussehen. Fügen Sie einen Testfall hinzu und verwenden Sie dann 'when' und' then'. – dmahapatro

+0

Was meinen Sie "Integration sollte nicht wie das aussehen, was Sie haben". Mein Testfall hat wann und dann ... –

+0

Hallo. Irgendwelche Glück mit diesem Problem? Haben Sie einen Weg gefunden, es zum Laufen zu bringen, oder einen Workaround? – Seagull

Antwort

-2

Es gibt eine Reihe von Besonderheiten in Ihrem Beispiel, z.

beans = { 
    myBean(Object){} 
} 

Ich kann mich nicht vorstellen, warum Sie eine Bohne vom Typ Object, erstellen wollen würden, aber vielleicht ist dies eine Vereinfachung Du für die Zwecke des Beispiels gemacht und die reale Bohne eine andere Art hat.

@Integration 
class MyServiceSpec extends Specification { 
    def myService 

    when: 
    def myBean = myService.myBean 

    then: 
    myBean != null 
} 

Dieser Test läuft darauf hinaus, Testen, ob Dependency Injection arbeitet nach unten, was bedeutet, dass Ihre Test Frühjahr/Grails anstatt Ihren eigenen Code. Das sollten Sie IMO nicht testen.

Wie auch immer Ihr Problem zu beheben, ich glaube, Sie müssen nur ein @Autowired Anmerkung

import org.springframework.beans.factory.annotation.* 

@Integration 
class MyServiceSpec extends Specification { 

    @Autowired 
    def myService 

    when: 
    def myBean = myService.myBean 

    then: 
    myBean != null 
} 
+1

Hey da. Der ganze Punkt des Beispiels ist zu zeigen, dass die Abhängigkeitsinjektion nicht funktioniert :). Der Test ist nur ein konstruiertes Beispiel, um das Problem zu demonstrieren. Das Hinzufügen von '@ Autowired' macht leider keinen Unterschied. Der Dienst wird nicht injiziert, myBean ist immer noch null. –

0

füge ich auf diesen einen zu der Party zu spät kann ... Aber für zukünftige Leser, versuchen grails.gorm.autowire zu true Einstellung in Ihrem application.yml