java - tutorial - Archivos de recursos no encontrados en los casos de prueba JUnit
prueba unitaria con junit (3)
Resumen
Mis pruebas JUnit no están encontrando los archivos que requieren durante la ejecución. Estoy usando Maven para la administración y compilación de dependencias.
Detalles
Todos los archivos requeridos por los casos de prueba se encuentran en: src/test/resources
.
Por ejemplo, src/test/resources/resourceFile.txt
.
Para acceder a un recurso utilizo el siguiente código:
URL url = getClass().getResource("/resourceFile.txt").getFile();
File file = new File(url);
Pero luego file.exists()
devuelve false
. Y el error que obtengo es:
Tests in error:
myJUnitTestCase(tests.MyJUnitTestClass): /home/me/workspace/Project%20Name/target/test-classes/resourceFile.txt (No such file or directory)
Tenga en cuenta que el siguiente da el mismo error (observe el eliminado /
prefijo):
URL url = getClass().getClassLoader().getResource("resourceFile.txt").getFile();
File file = new File(url);
Parece que los archivos de src/test/resources
no se copian en target/test-classes
.
¿Algunas ideas?
Las siguientes preguntas no ayudaron
¿Por qué no puedo acceder a src / test / resources en la prueba de Junit con Maven?
Cargando archivo de propiedades en JUnit @BeforeClass
¿Cómo lidiar con los datos de prueba en Junit?
Versiones de software
Ubuntu 12.04
Apache Maven 2.2.1
Java 1.7.0
Eclipse (Java EE IDE para desarrolladores web) Indigo Service Release 2
(truncado) 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>
¿Sabes que Maven se basa en el paradigma de la Convención sobre la configuración ? por lo tanto, no debe configurar cosas que son las predeterminadas.
Todo eso representa el valor predeterminado en Maven. Entonces, la mejor práctica es no definirlo, ya está hecho.
<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>
Esto es realmente redundante, excepto en los casos en que desea anular los valores predeterminados. Todas estas configuraciones son valores predeterminados implícitos.
Puede verificar eso al verificar su POM efectivo usando este comando
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>
Por ejemplo, si quiero apuntar a una ruta de recursos o ruta de recursos de prueba diferente, debe usar esto; de lo contrario, no.
<resources>
<resource>
<directory>/home/josh/desktop/app_resources</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>/home/josh/desktop/test_resources</directory>
</testResource>
</testResources>
Mi error, los archivos de recursos FUERON copiados en target/test-classes
. El problema parecía deberse a espacios en el nombre de mi proyecto , por ejemplo, Project%20Name
.
Ahora estoy cargando el archivo de la siguiente manera y funciona:
org.apache.commons.io.FileUtils.toFile(myClass().getResource("resourceFile.txt"));
O, (tomado de Java: ¿cómo obtener un archivo de una URL escapada? ) Esto puede ser mejor (sin dependencia de Apache Commons):
myClass().getResource("resourceFile.txt").toURI();