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>
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();
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>
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>