Ich weiß, dass ich eine Datei aus src / test / resources laden kann mit:
getClass().getResource("somefile").getFile()
Aber wie kann ich den vollständigen Pfad zum Verzeichnis src / test / resources abrufen , dh ich möchte keine Datei laden, sondern nur den Pfad des Verzeichnisses kennen?
org.junit.rules.TemporaryFolder
ständig ... aber ... um von Tests / Ressourcen zu kopieren, die Sie kennen müssen, ähm, ihren Pfad!Antworten:
Versuchen Sie, mit der
ClassLoader
Klasse zu arbeiten:A
ClassLoader
ist für das Laden in Klassen verantwortlich. Jede Klasse hat einen Verweis auf aClassLoader
. Dieser Code gibt aFile
aus dem Ressourcenverzeichnis zurück. Wenn SiegetAbsolutePath()
es aufrufen, wird das Absolute zurückgegebenPath
.Javadoc für
ClassLoader
: http://docs.oracle.com/javase/7/docs/api/java/lang/ClassLoader.htmlquelle
Sie müssen sich nicht mit Klassenladern anlegen. Tatsächlich ist es eine schlechte Angewohnheit, sich darauf einzulassen, da Klassenladeprogrammressourcen keine java.io.File-Objekte sind, wenn sie sich in einem JAR-Archiv befinden.
Maven legt automatisch das aktuelle Arbeitsverzeichnis fest, bevor Tests ausgeführt werden. Sie können also einfach Folgendes verwenden:
resourcesDirectory.getAbsolutePath()
gibt den korrekten Wert zurück, wenn Sie dies wirklich benötigen.Ich empfehle, ein
src/test/data
Verzeichnis zu erstellen, wenn Ihre Tests über das Dateisystem auf Daten zugreifen sollen. Dies macht deutlich, was Sie tun.quelle
Ich würde einfach
Path
von Java 7 verwendenOrdentlich und sauber!
quelle
Paths.get(...)
schlägt (für mich jedenfalls) vor, dass es nicht wird.File.separator
Konstante verwenden, um die Zeichenfolge zu erstellen, die als Pfad verwendet werden sollnew File("src/test/resources")
macht das Richtige auf allen Plattformen.Path resourceDirectory = Paths.get("src","test","resources");
?Paths.get("src", "test", "resources")
undPaths.get("src/test/resources")
funktioniert gut unter Windows 10 für mich. Was mache ich falsch? =)Wenn es sich um ein Frühjahrsprojekt handelt, können wir den folgenden Code verwenden, um Dateien aus dem Ordner src / test / resource abzurufen.
quelle
Ich habe ein Maven3-Projekt mit JUnit 4.12 und Java8. Um den Pfad einer Datei zu erhalten, die
myxml.xml
unter aufgerufen wirdsrc/test/resources
, mache ich dies aus dem Testfall heraus:Getestet unter Ubuntu 14.04 mit IntelliJ IDE. Referenz hier .
quelle
Der gesamte Inhalt
src/test/resources
wird in einentarget/test-classes
Ordner kopiert . Um also während des Maven-Builds eine Datei aus den Testressourcen abzurufen, müssen Sie sietest-classes
wie folgt aus dem Ordner laden :Nervenzusammenbruch:
getClass().getProtectionDomain().getCodeSource().getLocation().toURI()
- Gib dir URI zutarget/test-classes
.resolve(Paths.get("somefile"))
- wirdsomeFile
intarget/test-classes
Ordner aufgelöst.Original anwser ist entnommen aus dieser
quelle
Es gibt Unterschiede und Einschränkungen bei den von @Steve C und @ ashosborne1 angebotenen Optionen. Sie müssen spezifiziert werden, glaube ich.
Wann können wir verwenden :
File resourcesDirectory = new File("src/test/resources");
?IntelliJ IDEA
, aber ich denke, alle IDEs funktionieren so. Und diese Konfiguration, die manuell vorgenommen werden muss, ist überhaupt nicht gut. Wenn wir mit mehreren Tests arbeiten, die in verschiedenen Maven-Projekten vorhanden sind, aber in ein großes „IDE“ -Projekt importiert wurden, müssen wir uns daran erinnern und dürfen uns nicht entspannen und Freude an Ihrer Arbeit haben.Die von @ ashosborne1 angebotene Lösung (ich persönlich bevorzuge diese) erfordert zwei zusätzliche Anforderungen, die erfüllt sein müssen, bevor Sie Tests ausführen. Hier ist eine Liste der Schritte zur Verwendung dieser Lösung:
Erstellen Sie einen Testordner ("teva") und eine Datei ("readme") in "src / test / resources /":
src / test / resources / teva / readme
Die Datei muss im Testordner erstellt werden, sonst funktioniert sie nicht. Maven ignoriert leere Ordner.
mvn clean install
. Es werden auch Tests ausgeführt. Es kann ausreichen, nur Ihre Testklasse / -methode über maven auszuführen, ohne ein ganzes Projekt zu erstellen. Als Ergebnis werden Ihre Testressourcen in Testklassen kopiert. Hier ist ein Pfad:target/test-classes/teva/readme
Jetzt können Sie Ihren Test so oft über IDE ausführen, wie Sie möchten. Bis Sie mvn sauber laufen. Der Zielordner wird gelöscht.
Das Erstellen einer Datei in einem Testordner und das erstmalige Ausführen von maven, bevor Sie Tests über IDE ausführen, sind erforderliche Schritte. Wenn Sie ohne diese Schritte nur in Ihrer IDE Testressourcen erstellen, dann Test schreiben und nur über IDE ausführen, wird eine Fehlermeldung angezeigt. Durch Ausführen von Tests über mvn werden Testressourcen in target / test-classes / teva / readme kopiert und für einen Klassenladeprogramm zugänglich.
Sie fragen sich vielleicht, warum ich mehr als ein Maven-Projekt in IDE importieren muss und warum so viele komplizierte Dinge? Für mich eine der Hauptmotivationen: IDA-bezogene Dateien von Code fernzuhalten. Ich erstelle zuerst ein neues Projekt in meiner IDE. Es ist ein gefälschtes Projekt, das nur Inhaber von IDE-bezogenen Dateien ist. Dann importiere ich bereits vorhandene Maven-Projekte. Ich zwinge diese importierten Projekte, IDEA-Dateien nur in meinem ursprünglichen gefälschten Projekt zu behalten. Infolgedessen werden im Code keine IDE-bezogenen Dateien angezeigt. SVN sollte sie nicht sehen (bitte nicht anbieten, svn / git so zu konfigurieren, dass solche Dateien ignoriert werden). Auch ist es einfach sehr praktisch.
quelle
.gitignore
? Es sieht auch so aus, als würde IDEA Maven beim Ausführen von Tests automatisch ausführen (und standardmäßig das richtige Arbeitsverzeichnis festlegen$MODULE_DIR$
). Es ist also nicht erforderlich,mvn test
vorher manuell auszuführen , alles funktioniert sowohl mit Maven als auch mit IDEA mit nur einwandfrei"src/test/resources/somefile.txt"
.Angenommen, der Name der Testklasse lautet
TestQuery1
und es befindet sich einresources
Verzeichnis in Ihremtest
Ordner wie folgt:So erhalten Sie die URI von
TestQuery1
do:Gehen Sie folgendermaßen vor, um den URI einer der Dateien
TestQuery1
abzurufen:quelle
In einem häufigen Fall können Sie keine Datei aus einem Ressourcenordner für Tests verwenden. Der Grund dafür ist, dass Ressourcendateien im Ressourcenordner in einem JAR gespeichert werden. Sie haben also keinen richtigen Pfad im Dateisystem.
Die einfachste Lösung kann sein:
TemporaryFolder
Mit fromJUnit
können temporäre Dateien erstellt und nach Abschluss des Tests gelöscht werden. Klassen vonguava
Bibliothek werden zum Kopieren eines Ressourcenordners für Dateiformate verwendet.Beachten Sie bitte, dass wir, wenn wir einen Unterordner im Ressourcenordner verwenden, wie z. B.
good
einen, keinen führenden/
zum Ressourcenpfad hinzufügen müssen .quelle
Verwenden Sie Folgendes, um Hibernate mit Spring in Ihren Unit-Tests zu injizieren:
Wenn Sie das
hibernate.cfg.xml
Geschenk nicht in Ihremsrc/test/resources
Ordner haben, wird es automatisch auf das in Ihremsrc/main/resources
Ordner zurückgesetzt.quelle
Verwenden Sie .getAbsolutePath () für Ihr Dateiobjekt.
quelle
getFile()
eine Dateiinstanz zurückgegeben wird . Er sagt, dass diesgetAbsolutePath()
für eine Instanz des Dateiobjekts verwendet wird.Mit Spring können Sie es einfach aus dem Ressourcenordner lesen (entweder main / resources oder test / resources):
Erstellen Sie beispielsweise eine Datei:
test/resources/subfolder/sample.json
quelle
quelle