So schreiben Sie einen Junit-Test für DirectoryStream

Oct 20 2020

Ich habe diese Funktion in einer Klasse namens Test.java und sie beinhaltet;

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;
}

Im Grunde gibt es alle Ordner als Liste im Pfad "../../tmp" zurück. Ich möchte einen Test dafür schreiben, und so habe ich es gemacht, aber es funktioniert nicht:

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
    
    }
}

Ich erhalte den folgenden Fehler:

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

Antworten

1 OleksiiZghurskyi Oct 21 2020 at 19:10

Bei der Verwendung steht es @TempDirIhnen frei, bestimmte fest codierte Pfade (z. B. "../../Temp"im Snippent) nicht zu verwenden.

Grundsätzlich wird das temporäre Verzeichnis von automatisch für Sie erstellt junit. In den Tests können Sie es dann wie gewünscht bearbeiten, z. B. Dateien und Verzeichnisse erstellen.

Wenn Sie den Wert des temporären Verzeichnispfads abrufen müssen, können Sie einfach toString()das mit Anmerkungen versehene Feld aufrufen @TempDir.

Für Ihren speziellen Fall kann beispielsweise folgender Test geschrieben werden:

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);
    }
}

Hinweis:@TempDir Verwendet im Allgemeinen den temporären Dateidirektor y des Standardsystems . Dies hängt vom Betriebssystem ab und kann normalerweise über eine Umgebungsvariable ermittelt werden. Zum Beispiel zeigt TMPDIRauf meinem System auf /tmpVerzeichnis.