So überschreiben Sie das Verhalten von Spring @Autowired

8

Ein kleiner Hintergrund:

Ich verwende Spring 2.5 und insbesondere Spring IOC und Anmerkungen.

Ich verwende @Autowired in meinem Code (die Autowiring erfolgt nach Typ) und verwende @Component , um Klassen der automatischen Verdrahtung auszusetzen.

Die unten beschriebene Situation entstand, als ich versuchte, meinen Code zu testen.

Nun zu dem Problem:

Hinweis: Ich verwende einen anderen Spring-Kontext für die Testumgebung.

Ich habe eine Klasse FOO , die @Autowired ist, aber im Testkontext möchte ich eine andere Klasse des gleichen Typs MockFoo (erweitert FOO ) verwenden.

Die Spring-Installation schlägt natürlich automatisch fehl, da mehrere Optionen für die Dependency-Injektion der FOO -Klasse zur Verfügung stehen (sowohl FOO als auch MockFOO entsprechen der Typprüfung).

Ich suche nach einer Möglichkeit, die Test-Bean anstelle der Original-Bean zu injizieren.

Ich habe Spring erwartet, um es zu ermöglichen, dass die Context-Konfigurationsdatei eine Bean-Injektion außer Kraft setzt oder dass Spring nicht eine bestimmte Bean autowire.

ABER

All diese Optionen scheinen nur für die Beans zu existieren, die ursprünglich in der Spring-Context-Konfigurationsdatei definiert wurden.

    
Mark 16.05.2010, 10:01
quelle

3 Antworten

6

Verwenden Sie ReflectionTestUtils setze den Mock manuell anstelle der autowired Abhängigkeit (zu diesem Zweck darf dein Mock nicht im Frühling verwaltet werden, so dass keine Mehrdeutigkeit existiert)

    
Bozho 19.05.2010 10:57
quelle
2

Ich weiß, dass diese Frage ziemlich alt ist, aber ich denke, eine Antwort könnte für andere immer noch nützlich sein.

Da Sie wahrscheinlich nicht sowohl Foo als auch MockFoo in Ihrem Kontext mischen wollen, würde ich vorschlagen, Foo aus dem Komponenten-Scan zu entfernen. Dies kann beispielsweise durch Angabe von Filter ein- / ausschließen für <context:component-scan> .

Wenn Sie jedoch Komponententests durchführen, würde ich eher vorschlagen, keinen Spring-Kontext zu verwenden und nur "reine" Komponententests zu implementieren, indem Sie Mock-ups der Abhängigkeiten manuell einspeisen, so dass Sie nur eine einzige Klasse testen. Dies kann leichter erreicht werden, indem ein spöttisches Framework wie Mockito verwendet wird.

.

    
Didier L 13.08.2011 14:19
quelle
2

Ich stimme Didier zu. Hier sehen Sie ein Beispiel, wie Sie die Implementierungen, die Sie in Ihrem Testanwendungskontext vortäuschen möchten, ausschließen können.

%Vor%

Fügen Sie diesen Anwendungskontext wie folgt in Ihren Test ein:

%Vor%     
OurKid 23.09.2011 10:30
quelle