2012-05-10 12 views
51

SommarioRisorsa non file trovati dai casi di test JUnit

miei test JUnit non trovano i file di cui hanno bisogno durante l'esecuzione. Sto usando Maven per la gestione delle dipendenze e la compilazione.

Dettagli

Tutti i file richiesti dai casi di test si trovano in: src/test/resources.

Ad esempio, src/test/resources/resourceFile.txt.

Per accedere a una risorsa che uso il seguente codice:

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

Ma poi ritorna file.exists()false. E l'errore che ottengo è:

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

nota, il seguente dà lo stesso errore (notare il rimosso / prefisso):

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

Sembra come se i file da src/test/resources non sono sempre copiati in target/test-classes.

Qualche idea?

Le seguenti domande non ha aiutato

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?

Versioni software

Ubun tu 12.04

Apache Maven 2.2.1

Java 1.7.0

Eclipse (Java EE IDE per gli sviluppatori web) Servizio Indigo di uscita 2

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

'Sembra che i file di src/test/risorse non vengano copiati nelle classi target/test 'Lo hai effettivamente verificato? – ftr

+1

No, sono un idiota ... mi dispiace. Ho appena controllato e posso confermare che sono stati effettivamente copiati lì. Forse è dovuto al "% 20" nel percorso? –

+0

Stai provando ad aprire un flusso di input da quel file? In tal caso, è possibile utilizzare direttamente quanto segue per eseguire questa operazione (anziché utilizzare l'URL): .class.getClassLoader(). GetResourceAsStream (fileName) –

risposta

37

Il mio errore, i file di risorse sono stati effettivamente copiati target/test-classes.Il problema sembrava essere dovuto a spazi nel nome del mio progetto, ad es. Project%20Name.

Ora sto caricando il file come segue e funziona:

org.apache.commons.io.FileUtils.toFile(myClass().getResource("resourceFile.txt")‌​); 

Oppure, (tratto da Java: how to get a File from an escaped URL?) questo può essere meglio (senza dipendenza da Apache Commons):

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

In realtà, questa domanda risponde a questo: http://stackoverflow.com/questions/2166039/java-how-to-get-a-file-from-an-escaped-url – Kkkev

+0

grazie, ho aggiornato la risposta –

+0

Grazie Alex, sto affrontando lo stesso problema, e seguendo la tua risposta sta lavorando per me +1 !! – Hatim

10

Sapete che Maven si basa sulla convenzione sulla configurazione pardigm? quindi non dovresti configurare cose che sono le impostazioni predefinite.

Tutto ciò che rappresenta il valore predefinito in Maven. Quindi la best practice è non definirla già fatta.

<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

grazie per il suggerimento. il motivo per cui l'ho aggiunto è perché sono abbastanza inesperto con Maven, quindi volevo rendere le cose esplicite (rimuovere la magia) ... ma in futuro eliminerò la configurazione non necessaria. –

+1

sei sicuro che il comportamento richiesto da @AlexAverbuch sia davvero il valore predefinito in mvn? – jayunit100

+1

Se si utilizza Tycho ed eclipse-plugin come tipo di imballaggio, non dimenticare di adadd src/test/resources nel file build.properties. – Arcadien

1

Questo è effettivamente ridondante tranne nei casi in cui si desidera sovrascrivere i valori predefiniti. Tutte queste impostazioni sono predefinite implicite.

È possibile verificare che controllando il vostro POM efficace con questo 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> 

Per esempio, se voglio puntare a un diverso percorso percorso risorsa di prova o la risorsa si dovrebbe usare questo altrimenti tu no.

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