wake-up-neo.com

Maven (Surefire): Testressourcen von src/test/java kopieren

Maven Surefire (Test) Pluginmvn test-compile kopiert Dateien in src/test/resources nach target/test-classes. Er übersetzt .Java in src/test/Java und kopiert die kompilierten .class-Dateien nach target/test-classes.

Es werden jedoch keine Ressourcen aus src/test/Java kopiert, und es ist bequemer, Testressourcen in demselben Verzeichnis wie die .Java-Klassen ablegen zu können, für die sie Ressourcen sind, als in einer parallelen Hierarchie in src/test/resources.

Kann Maven Ressourcen von src/test/Java kopieren?

32
tpdi

Das Kopieren der Ressource wird vom maven-resource-plugin durchgeführt. Wenn Sie das entsprechende Dokument lesen, erfahren Sie, wie Sie Ressourcen von src/test/Java kopieren.

Unter http://maven.Apache.org/plugins/maven-resources-plugin/testResources-mojo.html finden Sie das Ziel für Testressourcen, das im Standardlebenszyklus enthalten ist.

Und dann sehen Sie http://maven.Apache.org/pom.html und suchen Sie nach <testResources>.

19
bmargulies

bmargulies gab die Antwort , aber lassen Sie mich einige Details angeben. 

<testresources> kann wie folgt zum <build>-Knoten des POM des Projekts hinzugefügt werden:

 <testResources>
  <testResource>
    <directory>${project.basedir}/src/test/Java</directory>
  </testResource>
 </testResources>

Das kopiert alles in src/test/Java - einschließlich des .Java-Quellcodes, den wir nicht wollen. 

Es überschreibt (wie von bmargulies nur angedeutet) auch die Standardeinstellung <testResources> im übergeordneten Standard-POM, von der alle anderen POM erben (sofern diese Vererbung nicht geändert wird). Die standardmäßigen übergeordneten Kopien src/test/resources. Wenn Sie dies überschreiben, erhalten wir das nicht wie üblich kopiert, was wir nicht wollen. (Insbesondere ist mein ganzer Grund, dies zu tun, die Verwendung von unitils, die die unitils.properties-Datei kopieren möchte - und das ist (für mich jedenfalls) in src/test/resources).

Also fügen wir src/test/resources wieder hinzu:

<testResources>
  <testResource>
    <directory>${project.basedir}/src/test/Java</directory>
  </testResource>
  <testResource>
    <directory>${project.basedir}/src/test/resources</directory>
  </testResource>
</testResources>

Die Kopien werden in der angegebenen Reihenfolge aufgeführt, sodass für Dateien, die sowohl in /src/test/Java (und in Unterverzeichnissen) als auch in /src/test/resources (und in Unterverzeichnissen) vorhanden sind, die src/test/resources-Version diejenige ist, die in test-classes endet.

Jetzt müssen wir nur noch not die .Java-Dateien kopieren:

<testResources>
  <testResource>
    <directory>${project.basedir}/src/test/Java</directory>
    <excludes>
        <exclude>**/*.Java</exclude>
    </excludes>
  </testResource>
  <testResource>
    <directory>${project.basedir}/src/test/resources</directory>
  </testResource>
</testResources>
36
assylias

Die einzige Art und Weise, wie es für mich funktionierte, wenn ich meine Testkonfiguration in den src/test/resources-Ordner (analog zu src/test/Java für Quelldateien) stelle. Dateien aus diesem Ordner werden während der Ausführung des Tests in den Ordner target/test-classes kopiert, der sich im Klassenpfad befindet. Ich weiß nicht warum, aber die nächste Konfiguration funktionierte nicht für mich:

<testResources>
  <testResource>
    <directory>${project.basedir}/src/test/Java</directory>
    <excludes>
        <exclude>**/*.Java</exclude>
    </excludes>
  </testResource>
  <testResource>
    <directory>${project.basedir}/src/test/resources</directory>
  </testResource>
</testResources>
2
Alex Barysevich

Ist es möglich, Maven zu kopieren Ressourcen von Src/Test/Java?

Ja, dies wird mit dem Plugin antrun problemlos erreicht.

0
javamonkey79