2012-09-13 12 views
38

Ho scritto un test unitario che scrive un file nel file system, dato nessun percorso scritto nella directory di lavoro; quindi, se eseguito dalla directory del progetto, scrive nella root del progetto, se nella directory padre dei progetti viene scritto nella directory root dei genitori.Qual è il modo corretto di scrivere nel file temporaneo durante i test unitari con Maven?

Quindi qual è il modo corretto di scrivere nella directory di destinazione? Molto probabilmente una directory all'interno della directory di destinazione?

Se si specifica semplicemente target/ con il file che scriverà sulla destinazione dei progetti padre anziché sulla destinazione dei progetti.

UPDATE: desidero effettivamente il file al termine del test. Il file è per un formato di estrazione per terze parti che deve essere inviato a terzi. Il test può essere attivato/disattivato per consentirmi di eseguire solo se il formato del file cambia per la nuova approvazione. Non è un grosso problema dove va il file, ma vorrei qualcosa di facile da trovare.

risposta

49

Si potrebbe provare a utilizzare TemporaryFolder JUnit @Rule come descritto here

Il TemporaryFolder crea una cartella in la directory di file temporanea predefinita specificata dalla proprietà di sistema java.io.tmpdir. Il metodo newFile crea un nuovo file nella directory temporanea e newFolder crea una nuova cartella.

Al termine del test, JUnit elimina automaticamente tutti i file e le directory inclusi in TemporaryFolder. JUnit garantisce l'eliminazione delle risorse, indipendentemente dal fatto che il test abbia esito positivo o negativo.


Dopo domanda aggiornato

È possibile modificare la directory di lavoro utilizzata da maven-surefire-plugin.

<plugins> 
    [...] 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <version>2.12.3</version> 
     <configuration> 
      <workingDirectory>${project.build.directory}</workingDirectory> 
     </configuration> 
     </plugin> 
    [...] 
</plugins> 

si può cambiare la directory di lavoro di tutto il necessario per i test come ${project.build.directory}/my_special_dir/.

La directory di lavoro nel plugin surefire interessa solo i test eseguiti e SOLO per i test eseguiti da Maven. Se si eseguono i test da un IDE, la directory di lavoro sarà un'altra cosa.

+0

Grazie a maba, questo è un problema simile a Bohemian, il file finisce in un luogo oscuro. In realtà voglio che il file finisca il test. –

+0

@BrettRyan OK, aggiornato con come modificare la directory di lavoro per il plugin surefire. Questo dovrebbe fare il trucco. – maba

+0

Fantastico, grazie maba, è perfetto e sarà sempre coerente su tutte le macchine su cui viene eseguito il test. –

2

Scriverò una routine che determina dove deve essere scritto il file, che successivamente vengo unito, in generale cerco di evitare (il più possibile) l'accesso a dati persistenti in unittests, come l'accesso ai file IO o al database, questo ha prestazioni ragioni e anche altri

Date un'occhiata a questo asnwer: https://stackoverflow.com/a/8032504/395659

+0

Grazie OD, non ho mai dovuto fare una cosa del genere fino ad ora.Ho scritto il test per scrivere un file che verrà inviato ad altri fornitori nel codice di produzione. file su disco da inviare ai fornitori per ottenere l'approvazione, una volta approvato il test non sarà necessario ma potrebbe essere utile in seguito quando qualcosa cambia e hanno bisogno di "riapprovare" l'output. –

+2

ma perché stai usando un "unit test" per tale scopo? Penso che persino avere una classe separata con il metodo main() per servire a tal fine sia ancora più appropriato rispetto al test unitario di abuso –

1

file temporanei dovrebbero essere creati nella directory temporanea. Recupera utilizzando la chiamata System.getProperty("java.io.tmpdir")

Il file temporaneo deve essere temporaneo, ovvero deve essere rimosso quando non è necessario. Per raggiungere questo obiettivo non dimenticate di eliminarlo in finally blocco o in codice che viene eseguito dopo il test, vale a dire:

File tmpFile = ... 
try { 
    // deal with tempFile 
} finally { 
    tempFile.delete(); 
} 

e/o

public class MyTestCase { 
    private File tmpFile = null; 

    @Before 
    public void setUp() { 
     tmpFile = ...; 
    } 

    @Test 
    public void setUp() { 
     // deal with tmpFile 
    } 

    @After 
    public void setUp() { 
     tmpFile.delete(); 
    } 
} 

Usa File.createTempFile(String prefix, String suffix) se è possibile, cioè è possibile quindi utilizzare il file con nome speciale generato da createTempFile().

Utilizzare file.deleteOnExit(). Questo crea un hook che rimuove automaticamente il file quando viene terminata la JVM. Il file rimarrà solo se JVM è stato ucciso con kill -9, quindi non ha avuto la possibilità di eseguire il codice di spegnimento.

24

Non c'è bisogno di reinventare la ruota ...

Il JDK fornisce un modo per creare un file temporaneo, e un modo per eliminare automaticamente in uscita:

File file = File.createTempFile("some-prefix", "some-ext"); 
file.deleteOnExit(); 

Utilizzare il file e verrà eliminato automaticamente al termine del test. Questo è tutto ciò che c'è da fare.

Per specificare la directory da utilizzare per i file temporanei, utilizzare il metodo di overload:

File file = File.createTempFile("prefix", "ext", new File("/some/dir/path")); 
+0

Grazie Bohemian, in realtà vorrei che il file rimanesse in giro dopo l'uscita, quindi posso inviarlo al venditore.Suppongo che la directory temporanea del sistema sia valida anche se spero di averla nella directory di destinazione. –

+0

Ho appena provato questo e risulta che il file si trova in un posto così oscuro che non sarebbe saggio usare. Concluso in '/ var/folders/xf/scvh7yr11m1glr4b663n1hcsnv5lf0/T/test2614442099335581603.xml' –

+1

@BrettRyan Nessun problema - è possibile specificare la directory utilizzata per i file temporanei - vedere la risposta modificata – Bohemian

2

Dovrai essere in grado di eseguire i test sia da un IDE che da Maven, quindi è consigliabile scrivere i test in modo che non presumano di essere eseguiti all'interno di Maven.

Uno dei modi migliori per gestire i file temporanei è l'utilizzo di junit rules. Ciò ti consente di fare affidamento sulla regola per pulire per te.

1

Per affermarlo in anticipo, sono fortemente contrario a fare queste cose in unit test. Non l'ho provato, ma dovrebbe funzionare:

Supponiamo che tu stia utilizzando il plugin surefire, dal documento che ha citato che puoi accedere alla directory di base del progetto in prova da System.getProperty("basedir"). Scaricalo e crea file sotto basedir/target.

Un modo più "appropriato" (come possiamo avere possibilità che abbiamo configurato directory di output per qualcosa di diverso, è possibile modificare la configurazione plug-in sicuro per qualcosa di simile:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <version>2.6</version> 
    <configuration> 
     <systemPropertyVariables> 
      <myOutDir>${project.build.outputDirectory}</myOutDir> 
     </systemPropertyVariables> 
    </configuration> 
</plugin> 

allora si può ottenere il reale output directory per System.getProperty("myOutDir") nel test

Problemi correlati