Тестировать с помощью файлов и каталогов в 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, а также во многих других примерах.
| Ссылка: | Тестирование с файлами и каталогами в JUnit с помощью @Rule от нашего партнера по JCG Рафаля Боровца в блоге Codeleak.pl . |