So schreiben Sie einen Junit-Test für DirectoryStream
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
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.