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