2011-01-05 9 views
2

Hoffentlich sollte eine einfache Frage ...Maven-Test/Ressourcen-Verzeichnis und Integrationstest

ich einen Integrationstest-Modul haben, die die Standard-Verzeichnisstruktur enthält:

src 
|-main 
|-test 
    |-java 
    |-resources 

Dann in meinem Ressourcenverzeichnis I eine xxxx.xml und xxxx.xsd Datei habe, und ich brauche, um diese Dateien in als Teil meiner Prüfung zu laden:

@Test 
public void should_do_some_stuff_with_xml_and_xsd() // not actual test name 
{ 
    File xmlFile = new File("xxxx.xml"); 
    File xsdFile = new File("xxxx.xsd"); 
    ... 
} 

es versucht immer wieder Fehler, die Datei zu laden, jetzt angenommen, ich war es unten t o ich muss es einen relativen Pfad von der Projektwurzel oder etwas geben. Ich brauche diesen Test extern auf meine IDE zu laufen, so dass ich die Tests auf dem Build-Server ausgeführt werden kann, wenn er dort ankommt ...

Also meine Frage ist, wie richte ich diese Dateien?

Antwort

11

Der Classpath Mechanismus funktioniert nicht für Dateien. Relative Dateipfade werden aus dem aktuellen Verzeichnis und nicht aus den Klassenpfadelementen aufgelöst.

Sie könnten also tun nur

File xmlFile = new File("target/test-classes/xxxx.xml"); 
File xsdFile = new File("target/test-classes/xxxx.xsd"); 

jedoch eine viel sauberere Lösung wäre mit Inputstreams statt Dateien zu arbeiten. Fast jede Bibliothek, die File-Parameter unterstützt, unterstützt auch Parameter. Und auf diese Weise können Sie ClassLoader Magie verwenden, ohne manuell alle Pfade Angabe:

ClassLoader cldr = Thread.currentThread().getContextClassLoader(); 
InputStream xmlStream = cldr.getResourceAsStream("xxxx.xml"); 
InputStream xsdStream = cldr.getResourceAsStream("xxxx.xsd"); 

Referenz:

+0

Wenn Sie wirklich nur eine Datei anstelle des Eingabestreams wünschen, können Sie Folgendes tun: 'Datei xmlFile = neue Datei (Thread.currentThread(). GetContextClassLoader(). GetResource (" xxxx.xml "));' – paperhat