Тестировать с помощью файлов и каталогов в 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 . |