Comment écrire un test Junit pour DirectoryStream
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
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.