7
votes

Suppression de fichier et répertoire dans Junit

J'écris un test pour une méthode qui crée un fichier dans un répertoire. Voici ce que mon test Junit ressemble à:

    public void createFile(String fileName, String text){

           //SOME_PATH is a static string which is a field of the class
           File dir = new File(SOME_PATH); //I modified SOME_PATH using whitebox for testing

           if(!dir.exists()){
                booelan createDir = dir.mkdirs();
                if(!createDir){
                           sysout("cannot make dir");
                           return;
                }
           }


           try{
                 FileWriter fileWrite = new FileWriter(dir.getAbsolutePath() + "/" + fileName, true);
                 fileWrite.write(text);
                 fileWrite.close();
           }
           catch(Exception e){
                 e.printStackTrace();
           }

    }


6 commentaires

êtes-vous sûr que objectedertest.createfile (Nomoffile, TextTowrite); Libérez toutes les ressources I.E. Ferme tout ruisseau / écrivain associé?


objectedertest.CreatEfile (Nomoffile, TextTowrite); Effectue un fichier filewriter.Close () après la création et l'écriture dans le fichier. J'ai aussi essayé de faire ObjecderStest = null sur la déchirure mais je ne peux toujours pas supprimer le fichier


J'utiliserais un nom de fichier différent pour chaque test. Vous pouvez générer le nom avec un compteur.


Je pense que je ne peux toujours pas supprimer le répertoire même que je supprime ces fichiers à l'aide de Deleteonexit () car je ne peux pas le faire avec un seul fichier


Voyons comment ObjecderStest.CreatEfile traite / fermez le digitalwriter.


J'ai également eu le même problème et après avoir lu des conseils par A4L, j'ai commencé à vérifier tous les flux d'entrée et de sortie, associé à ce fichier, associé à ce fichier: dès que je vous ai assuré que chaque flux est fermé, je pourrais supprimer le fichier en démolition!


4 Réponses :


12
votes

Utilisez l'annotation @RULE et le temporaire temporaire class pour le dossier que vous devez supprimer.

http://kentbeck.github.com/junit/javadoc/4.10/org/junit/rule.html (404 non trouvé)

Mise à jour Exemple d'utilisation par http://junit.org/junit4/javadoc/4.12/org /junit/roules/temporaryfolder.html : xxx


3 commentaires

Je ne pense pas pouvoir utiliser temporaire depuis la méthode que je teste est celle qui crée le dossier et le fichier


Pouvez-vous faire le dossier que vous souhaitez créer un dossier à l'intérieur d'un temporaire temporaire? IE: MockDirpath est un sous-dossier du temporaire.


Peut-être .. Tant que je ne modifierai pas la classe sous test. Je vais essayer d'espérer que les dossiers sous temporaire seront partis après le test: d. Merci pour la suggestion.



2
votes

Assurez-vous que la méthode ObjectUndertest.Createfile (Nomoffile, TextTowrite) ferme réellement tous les flux ouverts?


1 commentaires

Objecdertest.CreatEfile (...) effectue un fichier filewriter.Close (); Après avoir créé et écrire dans le fichier



7
votes

C'est comme ça que je nettoie habituellement des fichiers: xxx

Votre répertoire doit être vide pour la supprimer, assurez-vous qu'aucune autre méthode de test ne crée plus de fichiers.

Assurez-vous que vous fermez l'instance FileWriter dans un blocage enfin .


1 commentaires

Oui, mais le problème est que je ne peux pas supprimer le fichier, même si je suis sûr que le FileWriter est fermé dans la méthode testée. Je ne peux pas non plus exécuter ceci si je supprime le fichier en utilisant deleteonexit



0
votes

Je pense que la meilleure approche est la suppression après la sortie JVM:

Path tmp = Files.createTempDirectory(null);
tmp.toFile().deleteOnExit();


1 commentaires

AVERTISSEMENT À propos de Deleteonexit: Si vous appelez DeleteonExit beaucoup par exemple pour des fichiers temporaires et que votre application fonctionne pendant une longue période, par exemple JBoss Application Server, vous pouvez obtenir des erreurs de Memorory comme VM suivie une liste très longue de fichiers à supprimer au système. sortie qui ne se produit pas.