Ich möchte einen Test mit JerseyTest testen. Ich habe den folgenden Test erstellt:
%Vor% Meine Ressource hat auch eine AObject-Referenz mit @Autowired
Annotation.
Mein Problem ist, dass mein JerseyTest
und das Resource
(das durch den Test konfiguriert wird) verschiedene Instanzen für das Mock-Objekt haben. In der Konsole sehe ich, dass testApplicationContext.xml
zweimal geladen wird, einmal für den Test und einmal für die Ressource.
Wie kann ich Trikot zwingen, den gleichen Schein zu benutzen?
Nach dem Debuggen der Bibliothek von jersey-spring3 (Version 2.9.1) scheint das Problem in SpringComponentProvider.createSpringContext
zu liegen %Vor%Es wird geprüft, ob in den Eigenschaften der Anwendung eine Eigenschaft mit dem Namen "contextConfig" existiert, und wenn nicht, wird der Kontext der Spring-Anwendung initialisiert. Selbst wenn Sie in Ihren Tests einen Kontext für Spring-Anwendungen initialisiert haben, wird Trikot einen anderen Kontext erstellen und stattdessen diesen verwenden. Daher müssen wir den ApplicationContext aus unseren Tests in der Jersey Application-Klasse irgendwie bestehen. Die Lösung ist die folgende:
%Vor%Die obige Klasse wird den Anwendungskontext aus unseren Tests übernehmen und an die konfigurierte ResourceConfig übergeben, so dass der SpringComponentProvider den gleichen Anwendungskontext nach Jersey zurückgibt. Wir verwenden auch die jersey-spring-applicationContext.xml, um eine Jersey-spezifische Federkonfiguration zu integrieren.
Wir können JerseyTest nicht erben, weil es die Anwendung im Konstruktor initialisiert, bevor der Testanwendungskontext initialisiert wird.
Sie können diese Basisklasse jetzt zum Erstellen Ihrer Tests verwenden, zum Beispiel
%Vor%Fügen Sie in testContext.xml die folgende Definition hinzu, um ein Mock AObject zu injizieren.
%Vor%Ich konnte nicht die Antwort Ссылка von @Grigoris erhalten, obwohl seine Erklärung dafür, warum es passiert, korrekt ist .
Am Ende ging ich zum Ansatz, der einen speziellen Setter zum Einfügen des Mock-Objekts zeigt. Nicht so "sauber" wie der obige Ansatz, aber es lohnt sich, den apiProvider, den ich verspotten wollte, zu entlarven, damit ich einige Tests schreiben konnte.
%Vor%Tags und Links java unit-testing spring jersey junit