Frage

Ich habe eine große Anwendung verteilt auf mehr Spring-Bean Definition von XML-Dateien. In meinem Test-Suite laden ich manuell die XML-Dateien, die ich mit einem FileSystemXmlApplicationContext müssen die Tests, die ich ausführen möchten auszuführen. Dies reduziert die Testzeit aufgebaut und ermöglicht es mir, die gleichen genaue Konfigurationsdateien zu verwenden, die in der Produktion eingesetzt werden.

Jetzt versuche ich, Spring Transaktionstestbasisklassen, die nehmen die Konfigurations Standorte und laden den Kontext für mich zu verwenden. Aus irgendeinem Grund, wenn der Anwendungskontext kann Frühling erstellt wird keine der Konfigurationsdateien finden. Das ist verwirrend, weil ich den Test aus dem gleichen Arbeitsverzeichnis ausgeführt, wie wenn ich lade die Config selbst FileSystemXmlApplicationContext verwenden. Wenn ich alle meine Config-Standorten prepend mit „file:“ die Pfade ich in meinem Test angeben gefunden werden, aber alle Dateien, die importiert werden oder referenziert von Bohnen in der config definiert (zum Beispiel Eigenschaften Dateien) können nicht gefunden werden. Was ist das Problem? Kann ich Tests erhalten, die die Feder Kontext Testklassen erweitern das gleiche wie die, die arbeiten, wo ich den Kontext selbst erstellen?

Zum Beispiel, wie diese den Kontext zu schaffen funktioniert:

ApplicationContext ctx = new FileSystemXmlApplicationContext(new String[] { "WEB-INF/services-context.xml"})

Wenn ich AbstractTransactionalDataSourceSpringContextTests folgendes erstreckt sich nicht Dienste-context.xml finden:

@Override
protected String[] getConfigLocations() {
   return new String[] { "WEB-INF/services-context.xml"};
}

Dies findet Dienste-Kontext, aber die PropertyPlaceholderConfigurer dort nicht definiert, es ist Properties-Dateien zu finden.

 @Override
 protected String[] getConfigLocations() {
    return new String[] { "file:WEB-INF/services-context.xml"};
 }
War es hilfreich?

Lösung 2

Neben überwiegenden getConfigLocations ich auch loadContext overrode und verwendet, um einen treuen fileSystemXmlApplicationContext drin.

 @Override
 protected String[] getConfigLocations() {
     return new String[] { "WEB-INF/services-config.xml" };
 }

 @Override
 protected ConfigurableApplicationContext loadContext(String[] locations) throws Exception {
     return new FileSystemXmlApplicationContext(locations);
  }

Andere Tipps

Wir setzen alle unsere Frühlings-config und Eigenschaften von Dateien im Classpath, die Dinge einfach hält - wir können nur unsere Testklassen von einer Basisklasse erweitern wie:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={
        "/spring/*.xml", 
        "/testSpring/*.xml" })
public abstract class AbstractIntegrationTest  {

Hier sind die Wege sind alle Pfade in Classpath.

Wenn Sie das nicht tun wollen, haben Sie überprüft, wie Sie die Eigenschaften von Dateien in Ihren Diensten-context.xml verweisen? Ich vermute, dass, wenn Sie Datei hinzufügen: zu Ihrer Kontextkonfiguration, dann werden Sie auch diese, um Ihre Eigentum Dateireferenz hinzufügen müssen. Man könnte vielleicht nur über eine separate Test Frühling Config-Datei verwenden, um die Definition Ihrer Eigenschaft Platzhalter zu ändern, und legen Sie diese am Ende der Liste der Kontextdateien -. Seine Definitionen werden dann diejenigen, die in früheren Dateien definierten außer Kraft setzen

Ihre Config-Standorte sind relative URIs und werden als solche von der Basistestklasse interpretiert werden, mit dem URI relativ selbst der Testklasse an die Stelle gelöst werden. Versuchen Sie voll qualifizierte URIs verwenden, oder verwenden Sie relative URI unter Berücksichtigung, wo die Testklasse ist.

Sie können nicht verwenden Classpath XML Fabriken wie ClassPathXmlApplicationContext ?

Eine andere mögliche Lösung ist es, die services-config.xml und benennen als services-config-test.xml zu duplizieren und dann unter Classpath setzen. Das gleiche gilt für die Eigenschaften-Datei.

ApplicationContext ctx = new FileSystemXmlApplicationContext(new String[] { "WebRoot/WEB-INF/services-context.xml"})
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top