๐ค ๋ฐฐ๊ฒฝ
์ธ๋ถ ์๋น์ค์์ ๋งค์ผ ํน์ ์๊ฐ์ ๋ฐฐ์น๋ฅผ ํตํด ์ ๋ฌ๋๋ csv ํ์ผ์ ์ฝ๋ ๋ฐฐ์น ํ๋ก๊ทธ๋จ์ ๊ตฌํํ ๋ค, ํ์ผ ์ฝ๋ ๋ถ๋ถ์ ๊ฒ์ฆํ๊ธฐ ์ํด ๋จ์ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋ ค๊ณ ํ๋๋ฐ..
ํ์ผ ๊ด๋ จ ํ ์คํธ ์ฝ๋๋ ์ฒ์์ด๋ผ "ํ์ผ์ ์ด๋ป๊ฒ ๋ฐ๋ณต์ ์ธ ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํด์ผ ๋ ๊น?"๋ผ๋ ๊ณ ๋ฏผ์ ํ๊ฒ ๋์๊ณ , ๊ด๋ จ ๋ด์ฉ์ ์ฐพ์๋ณด๋ฉฐ ์๊ฒ ๋ @TempDir์ด๋ผ๋ ๊ฑธ ํ์ฉํด ๋ณด๊ฒ ๋์๋ค.
ํด๋น ๊ฒฝํ์ ๋ฐํ์ผ๋ก @TempDir์ ํตํ ํ ์คํธ ์ฝ๋ ์์ฑ ๋ฒ์ ๋ํด ๊ณต์ ํด๋ณด๊ณ ์ ํ๋ค.
1. @TempDir ์ด๋
- Junit์์ ์ง์ํ๋ ์์ ๋๋ ํฐ๋ฆฌ๋ฅผ ์์ฑ์ฉ ํ ์คํธ ์ด๋ ธํ ์ด์
- ๊ฐ๋ณ ํ ์คํธ ๋๋ ํ ์คํธ ํด๋์ค์ ๋ชจ๋ ํ ์คํธ์ ๋ํด ์์ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ ์ ๋ฆฌํ ์ ์๋ค.
- ํ ์คํธํ ๋ ์ง์ ํ์ผ์ ์์ฑํ๊ณ ์ญ์ ํ๋ ๊ณผ์ ์ ๊ด๋ฆฌํ๋ ๋ฒ๊ฑฐ๋ก์์ ์ ๊ฑฐํด ์ค๋ค.
2. ์ฃผ์์ฌํญ
@TempDir์ ๋ ๊ฐ์ง ํ์ ๋ง ์ง์ํ๋ค.
(1) java.nio.file.Path
(2) java.io.File
๋ค๋ฅธ ํ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ParameterResolutionException ์์ธ๋ฅผ ๋ฐ์์ํจ๋ค.
3. ์ฌ์ฉ ๋ฐฉ๋ฒ
public class TempFileTest {
@Getter
@Builder
public static class CsvFile {
private int id;
private String name;
private String type;
}
@Test
@DisplayName("1. Path ํ์์ผ๋ก ์ฝ๊ธฐ")
void simpleTestTempDirByPath(@TempDir Path tempDir) throws IOException {
// given
Path fileDir = tempDir.resolve("test.csv");
List<String> lines = List.of("1,ํ์๋ฐ,๋ธ๋ก๊ทธ", "2,๋ฐฑ์๋ฐ,์นดํ");
Files.write(fileDir, lines);
// when
List<CsvFile> records = readCsvFile(fileDir.toFile());
// then
assertThat(records).hasSize(2)
.extracting("id", "name", "type")
.contains(tuple(1, "ํ์๋ฐ", "๋ธ๋ก๊ทธ"), tuple(2, "๋ฐฑ์๋ฐ", "์นดํ"));
}
@TempDir File tempFile;
@Test
@DisplayName("2. File ํ์์ผ๋ก ์ฝ๊ธฐ")
void simpleTestTempDirByFile() throws IOException {
// given
File testFile = new File(tempFile, "simpleTest.txt");
List<String> lines = List.of("1,ํ์๋ฐ,๋ธ๋ก๊ทธ", "2,๋ฐฑ์๋ฐ,์นดํ");
Files.write(testFile.toPath(), lines);
// when
List<CsvFile> records = readCsvFile(testFile);
// then
assertThat(records).hasSize(2)
.extracting("id", "name", "type")
.contains(tuple(1, "ํ์๋ฐ", "๋ธ๋ก๊ทธ"), tuple(2, "๋ฐฑ์๋ฐ", "์นดํ"));
}
private List<CsvFile> readCsvFile(File fileDir) throws IOException {
List<CsvFile> records = new ArrayList<>();
try (BufferedReader br = new BufferedReader(new FileReader(fileDir))) {
String line;
while ((line = br.readLine()) != null) {
String[] values = line.split(",");
records.add(CsvFile.builder()
.id(Integer.parseInt(values[0]))
.name(values[1])
.type(values[2])
.build());
}
}
return records;
}
}
์ ํ ์คํธ ์ฝ๋ ์์์ฒ๋ผ Path ๋๋ File์ @TempDir ์ฃผ์๊ณผ ํจ๊ป ์์ฑํ๋ฉด ๋๋ค.
ํ๋ผ๋ฏธํฐ ๋๋ ํ๋ ํ์์ ์ฌ์ฉํ๋ ๊ฒ์ ์์ฑ์ ์์ ์ด๋ค.
- ๋ง์ฝ ํ ์คํธ๋ผ๋ฆฌ ํ์ผ/๋๋ ํฐ๋ฆฌ๋ฅผ ๊ณต์ ํ๊ณ ์ถ๋ค๋ฉด,
ํ๋ ๋ฐฉ์ + static์ ์ ์ธํด์ ์์ฑํ๋ฉด ๋๋ค. ๋จ, ํ ์คํธ๋ ์์๊ฐ ๋ณด์ฅ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋ง์ฝ ์ฐ์์ฑ ์๋ ํ ์คํธ๋ฅผ ์์ฑํ๋ ๊ฒฝ์ฐ @Order์ ์ฌ์ฉํ์ฌ ์์๋ฅผ ์ผ๊ด๋๊ฒ ์ ์ง์ํค๋ ๊ฒ ์ค์ํ๋ค.
- JUnit 5.9 ๋ฒ์ ๋ถํฐ @TempDir์๋ cleanup์ด๋ผ๋ ์ต์ ์ ์ ๊ณตํ๋ค.
ํด๋น ์ต์ ์ 3๊ฐ์ง ๊ธฐ๋ฅ์ ์ค์ ํ ์ ์๋ค.
ALWAYS: ํ
์คํธ๊ฐ ์๋ฃ๋ ํ, ์์ ๋๋ ํฐ๋ฆฌ ์ ๋ฆฌ (๊ธฐ๋ณธ ์ค์ )
NEVER: ํ
์คํธ๊ฐ ์๋ฃ๋ ํ, ์์ ๋๋ ํฐ๋ฆฌ ์ ๋ฆฌ X
ON_SUCCESS : ํ
์คํธ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์๋ฃ๋ ๊ฒฝ์ฐ์๋ง ์์ ๋๋ ํฐ๋ฆฌ๋ฅผ ์ ๋ฆฌ
๋ง์ฝ ์์๋ก ์์ฑํ ๋๋ ํฐ๋ฆฌ, ํ์ผ์ ์ ์งํ๋๋ก ๊ตฌํํ๊ณ ์ถ๋ค๋ฉด REFERENCE๋ฅผ ์ฐธ๊ณ ํด ๋ณด์.
REFERENCE
https://www.baeldung.com/junit-5-temporary-directory
๋๊ธ