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 et la compilation des dépendances.
Détails
Tous les fichiers requirejs par les scénarios de test 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);
Mais alors file.exists()
renvoie false
. Et l’erreur que j’ai est:
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 le test de Junit avec Maven?
Chargement du fichier de propriétés dans JUnit @BeforeClass
Comment gérer les données de test dans Junit?
Versions logicielles
Ubuntu 12.04
Apache Maven 2.2.1
Java 1.7.0
Eclipse (IDE Java EE pour développeurs Web) Indigo Service Release 2
(tronqué) Maven POM
4.0.0 com.groupId artifactId jar 1.0-SNAPSHOT name name target target/classes target/test-classes src/main/java src/test/java src/main/resources src/test/resources org.apache.maven.plugins maven-comstackr-plugin 1.6 1.6 UTF-8 junit junit 4.10 test
Mon erreur, les fichiers de ressources ont effectivement été copiés dans la 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 ça marche:
org.apache.commons.io.FileUtils.toFile(myClass().getResource("resourceFile.txt"));
Ou, (pris de Java: comment obtenir un fichier à partir d’une URL échappée? ), Cela peut être mieux (pas de dépendance à Apache Commons):
myClass().getResource("resourceFile.txt").toURI();
Vous savez que Maven est basé sur le pardigm Convention over Configuration ? vous ne devez donc pas configurer les éléments par défaut.
Toutes ces choses représentent la valeur par défaut dans Maven. Donc, la meilleure pratique est de ne pas la définir, c’est déjà fait.
target target/classes target/test-classes src/main/java src/test/java src/main/resources src/test/resources
Ceci est en fait redondant sauf dans les cas où vous voulez remplacer les valeurs par défaut. Tous ces parameters sont des valeurs implicites implicites.
Vous pouvez vérifier cela en vérifiant votre POM effectif en utilisant cette commande
mvn help:effective-pom
name target target/classes target/test-classes src/main/java src/test/java src/main/resources src/test/resources
Par exemple, si je veux pointer vers un chemin de ressource de test ou un chemin de ressource différent, vous devez l’utiliser sinon vous ne le faites pas.
/home/josh/desktop/app_resources /home/josh/desktop/test_resources