2016-07-26 13 views
0

Ich versuche, einige Komponententests für ein Java-Servlet zu schreiben, die Dateien schreiben und löschen können. Ich habe config.properties-Dateien für meine Entwickler- und Prod-Builds sowie eine, die in Test/Ressourcen lebt, die nur während Tests aufgerufen wird. Ich schreibe in eine temporäre Datei, die später gelöscht wird.Erstellen und Löschen von Dateien in Maven Test/Ressourcen-Verzeichnis

canceled.filepath = src/test/resources/Cancel.txt temp.filepath = src/test/resources/Cancel_temp.txt

Mein Problem ist, dass ich einen Fehler aus dem Servlet geworfen bekommen sagen, kann ich Lösche die temporäre Datei nicht. Ich vermute, dass dies auf einen Zugriffsfehler zurückzuführen ist. Gibt es irgendwo, wo ich diese Dateien machen kann, so dass meine Unit Tests durchführt und volle Erlaubnis zum Schreiben/Löschen hat?

Dank

+2

Warum die temporäre Datei im temporären Standard nicht erstellen Verzeichnis Ihres Systems? ['Files.createTempFile'] (https://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#createTempFile-java.nio.file.Path-java.lang. String-java.lang.String-java.nio.file.attribute.FileAttribute ...-). Mit JUnit können Sie auch einen ['TemporaryFolder'] (http://junit.org/junit4/javadoc/4.12/org/junit/rules/TemporaryFolder.html) verwenden. – Tunaki

+0

Die Konfigurationsdatei gibt dem Servlet den Pfad, in dem wir uns gerade befinden möchte Dateioperationen durchführen. Das Servlet selbst schreibt und löscht die Dateien. Ich habe versucht, ihm einen Pfad zu einem temporären Verzeichnis zu geben, aber das Löschen wird immer noch nicht abgeschlossen. –

+0

Das Servlet sollte nur durch die 'ServletConfig' konfiguriert werden. Wenn Sie dies tun, können Sie in Ihrem Test die Methode 'Servlet.init (ServletConfig)' aufrufen und eine Testkonfiguration angeben. –

Antwort

2

Verwenden Sie die JUnit 4 TemporaryFolder Regel die Dateisystem-Interaktionen für Sie zu verwalten.

public class MyTestClass { 
//MUST be public 
    @Rule 
    public TemporaryFolder tempFolder = new TemporaryFolder(); 

    @Test 
    public void test() throws Exception{ 
    //You can create new files. 
    File tmpFile = tempFolder.newFile(); 
    System.out.println(tmpFile.getAbsolutePath()); 
    System.out.println(tmpFile.exists()); 

    //Or new Folders 
    File myFolder = tempFolder.newFolder("My_Folder"); 
    System.out.println(myFolder.getAbsolutePath()); 
    System.out.println(myFolder.exists()); 

    //or a combination of them. 
    File newFileInMyFolder = tempFolder.newFile("My_Folder\\subfile.txt"); 
    System.out.println(newFileInMyFolder.getAbsolutePath()); 
    System.out.println(newFileInMyFolder.exists()); 

    // The Junit rule uses the system property 'java.io.tempdir' to create them, and it handles the cleanup outside 
    // the scope of your test! 
    } 
} 

Ausgang:

C:\Users\Jeremiah\AppData\Local\Temp\junit4815976615865849247\junit796088998678325697.tmp 
true 
C:\Users\Jeremiah\AppData\Local\Temp\junit4815976615865849247\My_Folder 
true 
C:\Users\Jeremiah\AppData\Local\Temp\junit4815976615865849247\My_Folder\subfile.txt 
true 

Nachdem der Text ausführt, übernimmt die Regel Implementierung all clean-up, solange die Dateien, die Regel erstellt wurden.

Basierend auf Ihrer Frage, können Sie wahrscheinlich Ihre Systemeigenschaften in einem @Before Block gesetzt und dann darauf vertrauen, dass sie für den Kontext des aktiven Tests vorhanden sind.

public class MyServletTest { 
    //MUST be public 
    @Rule 
    public TemporaryFolder tempFolder = new TemporaryFolder(); 

    @Before 
    public void setTestPaths() throws Exception { 
     File cancelFile = tempFolder.newFile("Cancel.txt"); 
     File cancelTemp = tempFolder.newFile("Cancel_temp.txt"); 

     System.setProperty("canceled.filepath", cancelFile.getAbsolutePath()); 
     System.setProperty("temp.filepath", cancelTemp.getAbsolutePath()); 
    } 

    @After 
    public void restorePaths() { 
     //FIXME: The JVM will be reused, if you have any other tests relying on the system properites they will be getting the values set in the BEFORE block. 
    } 

    @Test 
    public void checkSysVars() { 
     String cancelPath = System.getProperty("canceled.filepath"); 
     String tmpPath = System.getProperty("temp.filepath"); 

     File cancelFile = new File(cancelPath); 
     File cancelTemp = new File(tmpPath); 
     System.out.println(cancelFile.getAbsolutePath()); 
     System.out.println(cancelFile.exists()); 
     System.out.println(cancelTemp.getAbsolutePath()); 
     System.out.println(cancelTemp.exists()); 

    } 
} 

Wieder Konsolenausgabe:

C:\Users\Jeremiah\AppData\Local\Temp\junit7380201043103411996\Cancel.txt 
true 
C:\Users\Jeremiah\AppData\Local\Temp\junit7380201043103411996\Cancel_temp.txt 
true 
+0

genial, danke –