2012-05-10 10 views
51

Resumenrecursos no se han encontrado contenidos de casos de prueba JUnit

Mis pruebas JUnit no están encontrando los archivos que se 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.

acceder a un recurso que utilizo el siguiente código:

URL url = getClass().getResource("/resourceFile.txt").getFile(); 
File file = new File(url); 

Pero luego vuelve file.exists()false. Y el error que consigo es:

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

nota, el siguiente da el mismo error (nótese la retirada / prefijo):

URL url = getClass().getClassLoader().getResource("resourceFile.txt").getFile(); 
File file = new File(url); 

Parece como si los archivos de src/test/resources no están siendo copiados en target/test-classes.

¿Alguna idea?

Las siguientes preguntas no ayudaron

Why Can't I access src/test/resources in Junit test run with Maven?

Loading Properties File In JUnit @BeforeClass

How to deal with the test data in Junit?

versiones de software

Ubun ma 12,04

Apache Maven 2.2.1

Java 1.7.0

Eclipse (Java EE IDE para desarrolladores web) Servicio Indigo Release 2

(truncada) 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> 
+2

'Parece como si los archivos de src/test/resources no se están copiando en target/test-classes' ¿Realmente lo verificaste? – ftr

+1

No, soy un idiota ... lo siento. Acabo de verificar y puedo confirmar que en realidad están copiados allí. Tal vez se deba al "% 20" en la ruta? –

+0

¿Está tratando de abrir una secuencia de entrada desde ese archivo? Si es así, puede usar lo siguiente directamente para hacer esto (en lugar de usar el URL): .class.getClassLoader(). GetResourceAsStream (fileName) –

Respuesta

37

Mi error, los archivos de recursos en realidad eran copiados a target/test-classes.El problema parece deberse a espacios en mi nombre de proyecto, p. Ej. 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: how to get a File from an escaped URL?) esto puede ser mejor (sin dependencia de Apache Commons):

myClass().getResource("resourceFile.txt")‌​.toURI(); 
+0

De hecho, esta pregunta responde que: http://stackoverflow.com/questions/2166039/java-how-to-get-a-file-from-an-escaped-url – Kkkev

+0

gracias, he actualizado la respuesta –

+0

Gracias Alex, me enfrento al mismo problema, y ​​después de tu respuesta está trabajando para mí +1. – Hatim

10

Sabe que Maven se basa en el Convenio sobre configuración pardigm? 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> 
+1

gracias por la sugerencia. La razón por la que lo agregué es porque no tengo mucha experiencia con Maven, así que quería hacer las cosas más explícitas (eliminar la magia) ... pero eliminaré la configuración innecesaria en el futuro. –

+1

¿está seguro de que el comportamiento solicitado por @AlexAverbuch es realmente el predeterminado en mvn? – jayunit100

+1

Si usa Tycho y eclipse-plugin como tipo de paquete, no olvide agregar a src/test/resources en el archivo build.properties. – Arcadien

1

Esto es realmente redundante, excepto en los casos en que desea anular los valores predeterminados. Todas estas configuraciones son valores predeterminados implícitos.

Puede comprobar que, al revisar su POM efectiva 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 ruta del recurso prueba o recurso diferente que puedes usar esto de otra manera tu no

<resources> 
     <resource> 
      <directory>/home/josh/desktop/app_resources</directory> 
     </resource> 
    </resources> 
    <testResources> 
     <testResource> 
      <directory>/home/josh/desktop/test_resources</directory> 
     </testResource> 
    </testResources> 
Cuestiones relacionadas