Como escrever teste junit para DirectoryStream
Eu tenho essa função em uma classe chamada Test.java e inclui;
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;
}
então, basicamente, ele retorna todas as pastas como uma lista no caminho "../../tmp". Quero escrever um teste para isso, e foi assim que fiz, mas não funciona:
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
}
}
Eu estou recebendo o seguinte erro;
..\..\Temp
java.nio.file.NoSuchFileException: ..\..\Temp
Respostas
Ao usar, @TempDirvocê está livre para não usar alguns caminhos específicos "../../Temp"embutidos no código (por exemplo, no trecho).
Basicamente, o diretório temporário será criado automaticamente para você por junit. Então, nos testes, você pode manipulá-lo da maneira que desejar, por exemplo, criar arquivos e diretórios.
Se você precisar obter o valor do caminho do diretório temporário, pode simplesmente invocar toString()no campo anotado com @TempDir.
Por exemplo, para o seu caso específico, o seguinte teste pode ser escrito:
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);
}
}
Nota: Em geral, @TempDirfaz uso do diretório de arquivos temporários do sistema padrão y. Isso depende do sistema operacional e normalmente pode ser encontrado por meio da variável de ambiente. Por exemplo, TMPDIRno meu sistema aponta para o /tmpdiretório.