วิธีเขียน Junit Test สำหรับ DirectoryStream

Oct 20 2020

ฉันมีฟังก์ชั่นนี้ในคลาสที่เรียกว่า Test.java และมันรวม;

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

ดังนั้นโดยพื้นฐานแล้วจะส่งคืนโฟลเดอร์ทั้งหมดเป็นรายการในเส้นทาง "../../tmp" ฉันต้องการเขียนแบบทดสอบและนี่คือวิธีที่ฉันทำ แต่ไม่ได้ผล:

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

ฉันได้รับข้อผิดพลาดต่อไปนี้

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

คำตอบ

1 OleksiiZghurskyi Oct 21 2020 at 19:10

เมื่อใช้งาน@TempDirคุณมีอิสระที่จะไม่ใช้เส้นทางแบบฮาร์ดโค้ดที่เฉพาะเจาะจง (เช่น"../../Temp"ในตัวอย่างข้อมูล)

junitโดยทั่วไปไดเรกทอรีชั่วคราวจะได้รับการสร้างขึ้นสำหรับคุณโดยอัตโนมัติ จากนั้นในการทดสอบคุณสามารถจัดการได้ตามที่คุณต้องการเช่นสร้างไฟล์และไดเร็กทอรี

หากคุณต้องการที่จะได้รับค่าของเส้นทางไดเรกทอรีชั่วคราวคุณก็สามารถเรียกใช้บนสนามกำกับด้วยtoString()@TempDir

ตัวอย่างเช่นสำหรับกรณีเฉพาะของคุณสามารถเขียนการทดสอบต่อไปนี้:

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

หมายเหตุ:โดยทั่วไป@TempDirใช้ประโยชน์จากผู้กำกับไฟล์ชั่วคราวของระบบเริ่มต้น y ขึ้นอยู่กับระบบปฏิบัติการและโดยปกติสามารถพบได้ผ่านตัวแปรสภาพแวดล้อม ตัวอย่างเช่นTMPDIRบนระบบของฉันชี้ไปที่/tmpไดเร็กทอรี