web-dev-qa-db-fra.com

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

Résumé

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

Détails

Tous les fichiers requis par les cas de test sont situés 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);

Mais alors file.exists() renvoie false. Et l'erreur que je reçois est la suivante:

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

Notez que 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 suivantes n'ont pas aidé

Pourquoi ne puis-je pas accéder à src/test/resources dans l'exécution de test Junit avec Maven?

Chargement du fichier de propriétés dans JUnit @BeforeClass

Comment traiter les données de test dans Junit?

Versions du logiciel

Ubuntu 12.04

Apache Maven 2.2.1

Java 1.7.0

Eclipse (Java EE IDE pour les développeurs Web) 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>
63
Alex Averbuch

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

Je charge maintenant le fichier comme suit et cela fonctionne:

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

Ou, (extrait de Java: comment obtenir un fichier à partir d'une URL échappée? ) c'est peut-être mieux (aucune dépendance à Apache Commons):

myClass().getResource("resourceFile.txt")‌​.toURI();
41
Alex Averbuch

Vous savez que Maven est basé sur le Convention over Configuration pardigm? Vous ne devez donc pas configurer les éléments 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
khmarbaise

Cela est en réalité redondant, sauf dans les cas où vous souhaitez remplacer les valeurs par défaut. Tous ces paramètres sont des valeurs implicites par défaut.

Vous pouvez vérifier cela en vérifiant votre POM effectif 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 autre chemin de ressource de test ou un chemin de ressource, vous devez utiliser ceci sinon vous ne le ferez pas.

    <resources>
        <resource>
            <directory>/home/josh/desktop/app_resources</directory>
        </resource>
    </resources>
    <testResources>
        <testResource>
            <directory>/home/josh/desktop/test_resources</directory>
        </testResource>
    </testResources>
1
theyCallMeJun

Les classes principales doivent être sous src/main/Java
et
les classes de test doivent être sous src/test/Java

Si tous aux bons endroits et toujours les classes principales ne sont pas accessibles, alors
Faites un clic droit sur projet => Maven => Mettre à jour le projet
J'espère que cela résoudra le problème

0