Force Jersey, um Mocks von JerseyTest zu lesen

8

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?

    
Schaliasos 01.07.2014, 11:59
quelle

3 Antworten

15

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%     
Grigoris Grigoriadis 01.07.2014, 14:24
quelle
1

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%     
Kevin 14.11.2016 14:29
quelle
0

Wenn jemand an der Lösung Ссылка von Kevin für Jersey v1 interessiert ist:

%Vor%     
VincentS 22.02.2018 08:05
quelle