Comment écrire un test Junit pour DirectoryStream

Oct 20 2020

J'ai cette fonction dans une classe appelée Test.java et elle comprend;

public List<Path> getAllFoldersInTmp(String directory) throws IOException {
    final List<Path> files = new ArrayList<>();
    try (DirectoryStream<Path> stream = Files.newDirectoryStream(Path.of(directory))) {
        for (Path entry : stream) {
            if (Files.isDirectory(entry)) {
                files.add(entry);
            }
        }
    }
    return files;
}

donc fondamentalement, il renvoie tous les dossiers sous forme de liste dans le chemin "../../tmp". Je veux écrire un test pour cela, et voici comment j'ai fait mais cela ne fonctionne pas:

import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import org.junit.jupiter.api.Test;

class Testing{
    
    @Autowired
    Test test;
    @TempDir
    Path directory;
    
    @Test
    public void givenDir_whenUsingDirectoryStream_thenListAllFiles() throws IOException {
    
        File fileOne = directory.resolve("file1").toFile();
        File fileTwo = directory.resolve("file2").toFile();
    
        System.out.println(test.getAllFoldersInTmp("../../Temp")); //since the fileone and fileTwo are stored in `Temp/someRandomNumber` directory
    
    }
}

Je reçois l'erreur suivante;

 ..\..\Temp
java.nio.file.NoSuchFileException: ..\..\Temp

Réponses

1 OleksiiZghurskyi Oct 21 2020 at 19:10

Lors de l'utilisation, @TempDirvous êtes libre de ne pas utiliser certains chemins spécifiques codés en dur (par exemple "../../Temp"dans l'extrait de code).

Fondamentalement, le répertoire temporaire sera créé automatiquement pour vous par junit. Ensuite, dans les tests, vous pouvez le manipuler comme vous le souhaitez, par exemple créer des fichiers et des répertoires.

Si vous avez besoin d'obtenir la valeur du chemin du répertoire temporaire, vous pouvez simplement l'invoquer toString()sur le champ annoté avec @TempDir.

Par exemple, pour votre cas spécifique, le test suivant peut être écrit:

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir;

import java.io.IOException;
import java.nio.file.DirectoryStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;

import static org.junit.jupiter.api.Assertions.assertEquals;

class FoldersResolverTest {

    @TempDir
    Path directory;

    // assume FoldersResolver wrapps getAllFoldersInTmp 
    FoldersResolver foldersResolver = new FoldersResolver();

    @Test
    void directoriesAreFoundAndFilesAreSkipped() throws IOException {

        Path fileOne = directory.resolve("file1");
        Path fileTwo = directory.resolve("file2");
        Path directoryOne = directory.resolve("directory1");
        Path directoryTwo = directory.resolve("directory2");

        Files.createFile(fileOne);
        Files.createFile(fileTwo);
        Files.createDirectory(directoryOne);
        Files.createDirectory(directoryTwo);

        // note directory.toString() returns path to the temporary folder created by junit
        List<Path> actual = foldersResolver.getAllFoldersInTmp(directory.toString());

        List<Path> expected = List.of(directoryOne.getFileName(), directoryTwo.getFileName());
        assertEquals(expected, actual);
    }
}

Remarque: en général, @TempDirutilise le directeur de fichiers temporaires système par défaut y. Cela dépend du système d'exploitation et peut normalement être trouvé via la variable d'environnement. Par exemple, TMPDIRsur mon système pointe vers le /tmprépertoire.