Fichiers de ressources non trouvés dans les cas de test de JUnit

résumé

mes tests JUnit ne trouvent pas les fichiers dont ils ont besoin pendant l'exécution. J'utilise Maven pour la gestion et la compilation des dépendances.

détails

tous les fichiers requis par les cas d'essai se trouvent dans src/test/resources .

par exemple, src/test/resources/resourceFile.txt .

pour accéder à une ressource j'utilise le code suivant:

URL url = getClass().getResource("/resourceFile.txt").getFile();
File file = new File(url);

puis file.exists() renvoie false . Et l'erreur que j'obtiens est:

Tests in error: 
  myJUnitTestCase(tests.MyJUnitTestClass): /home/me/workspace/Project%20Name/target/test-classes/resourceFile.txt (No such file or directory)

Note, ce qui suit donne la même erreur (notez le préfixe / supprimé):

URL url = getClass().getClassLoader().getResource("resourceFile.txt").getFile();
File file = new File(url);

il semble que les fichiers de src/test/resources ne soient pas copiés dans target/test-classes .

des idées?

les questions n'ont pas aidé

pourquoi ne puis-je pas accéder au src/test/resources dans Junit test run with Maven?

Loading Properties File In JUnit @Beforreclass

Comment gérer les données de test Junit?

Logiciels

Ubuntu 12.04

Apache Maven 2.2.1

Java 1.7.0

Eclipse (Java EE IDE for Web Developers) Indigo Service Release 2

(tronqué) Maven POM

<?xml version="1.0" encoding="UTF-8"?>
<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.groupId</groupId>
    <artifactId>artifactId</artifactId>
    <packaging>jar</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>name</name>
    <build>
        <finalName>name</finalName>
        <directory>target</directory>
        <outputDirectory>target/classes</outputDirectory>
        <testOutputDirectory>target/test-classes</testOutputDirectory>
        <sourceDirectory>src/main/java</sourceDirectory>
        <testSourceDirectory>src/test/java</testSourceDirectory>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
            </resource>
        </resources>
        <testResources>
            <testResource>
                <directory>src/test/resources</directory>
            </testResource>
        </testResources>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>
55
demandé sur Community 2012-05-10 18:28:17

3 réponses

mon erreur, les fichiers de ressources ont été en fait copiés sur target/test-classes . le problème semblait être dû à des espaces dans mon nom de projet , par exemple Project%20Name .

je charge maintenant le fichier comme suit et il fonctionne:

org.apache.commons.io.FileUtils.toFile(myClass().getResource("resourceFile.txt")‌​);

Or, (tiré de Java: comment obtenir un fichier à partir d'une URL échappée? ) ceci peut être mieux (pas de dépendance sur Apache Commons):

myClass().getResource("resourceFile.txt")‌​.toURI();
38
répondu Alex Averbuch 2017-05-23 12:18:09

vous savez que Maven est basé sur la Convention sur la Configuration pardigm? vous ne pouvez pas configurer les choses qui sont les valeurs par défaut.

tout cela représente la valeur par défaut dans Maven. Donc, la meilleure pratique est de ne pas le définir c'est déjà fait.

    <directory>target</directory>
    <outputDirectory>target/classes</outputDirectory>
    <testOutputDirectory>target/test-classes</testOutputDirectory>
    <sourceDirectory>src/main/java</sourceDirectory>
    <testSourceDirectory>src/test/java</testSourceDirectory>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
    </resources>
    <testResources>
        <testResource>
            <directory>src/test/resources</directory>
        </testResource>
    </testResources>
11
répondu khmarbaise 2012-05-10 18:53:14

c'est en fait redondant sauf dans les cas où vous voulez outrepasser les valeurs par défaut. Tous ces paramètres sont implicites par défaut.

vous pouvez vérifier qu'en vérifiant votre POM efficace en utilisant cette commande

mvn help:effective-pom

    <finalName>name</finalName>
    <directory>target</directory>
    <outputDirectory>target/classes</outputDirectory>
    <testOutputDirectory>target/test-classes</testOutputDirectory>
    <sourceDirectory>src/main/java</sourceDirectory>
    <testSourceDirectory>src/test/java</testSourceDirectory>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
    </resources>
    <testResources>
        <testResource>
            <directory>src/test/resources</directory>
        </testResource>
    </testResources>

par exemple, si je veux pointer vers un chemin de Ressource de test ou un chemin de ressource différent, vous devriez utiliser ceci sinon vous ne le faites pas.

    <resources>
        <resource>
            <directory>/home/josh/desktop/app_resources</directory>
        </resource>
    </resources>
    <testResources>
        <testResource>
            <directory>/home/josh/desktop/test_resources</directory>
        </testResource>
    </testResources>
1
répondu Josh Uzo 2017-11-09 03:59:33