Статьи

Тестирование с файлами и каталогами в JUnit с помощью @Rule

Тестировать с помощью файлов и каталогов в JUnit легко благодаря TemporaryFolder @Rule .

В JUnit правила ( @Rule ) могут использоваться как альтернатива или дополнение к методам настройки и очистки org.junit.Before ( org.junit.Before , org.junit.After , org.junit.BeforeClass и org.junit.AfterClass ), но они более мощные, и их легче распределить между проектами и классами.

Код для тестирования

1
2
3
4
5
6
7
public void writeTo(String path, String content) throws IOException {
    Path target = Paths.get(path);
    if (Files.exists(target)) {
        throw new IOException("file already exists");
    }
    Files.copy(new ByteArrayInputStream(content.getBytes("UTF8")), target);
}

Вышеуказанный метод может записать данное содержимое String в несуществующий файл. Есть два случая, которые можно проверить.

Тест

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public class FileWriterTest {
 
    private FileWriter fileWriter = new FileWriter();
 
    @Rule
    public TemporaryFolder temporaryFolder = new TemporaryFolder();
 
    @Rule
    public ExpectedException thrown = ExpectedException.none();
 
    @Test
    public void throwsErrorWhenTargetFileExists() throws IOException {
        // arrange
        File output = temporaryFolder.newFile("output.txt");
 
        thrown.expect(IOException.class);
        thrown.expectMessage("file already exists");
 
        // act
        fileWriter.writeTo(output.getPath(), "test");
    }
 
    @Test
    public void writesContentToFile() throws IOException {
        // arrange
        File output = temporaryFolder.newFolder("reports")
                .toPath()
                .resolve("output.txt")
                .toFile();
 
        // act
        fileWriter.writeTo(output.getPath(), "test");
 
        // assert
        assertThat(output)
                .hasContent("test")
                .hasExtension("txt")
                .hasParent(resolvePath("reports"));
    }
 
    private String resolvePath(String folder) {
        return temporaryFolder
                .getRoot().toPath()
                .resolve(folder)
                .toString();
    }
}

Правило TemporaryFolder предоставляет два метода для управления файлами и каталогами: newFile и newFolder . Оба метода возвращают нужный объект во временную папку, созданную в методе установки. В случае, если необходим путь к самой временной папке, можно getRoot метод getRoot для TemporaryFolder .

Все, что будет добавлено во временную папку во время тестов, будет автоматически удалено после завершения теста, несмотря на то, был он успешным или нет.

Этот пример можно найти в моем unit-testing-demo проекте для GitHub, а также во многих других примерах.