넥스트스텝 클린코드 TDD 진행 중 @ParameterizedTest를 사용해서 반복을 줄이면서도 여러 테스트를 진행하려고 했다.
org.junit.jupiter.api.extension.ParameterResolutionException:
No ParameterResolver registered for parameter [java.lang.String arg1] in method
[void calculator.ParserTest.findCustomDelimiter(java.lang.String,java.lang.String,java.lang.String)].
에러를 읽어보니 테스트코드의 인자가 하나 부족하다는 말 같았다.
@ParameterizedTest
@CsvSource(value = {"//;\n1;2;3:;:1;2;3"}, delimiter = ':')
void findCustomDelimiter(String text, String del, String output){
Parser parser = new Parser(text);
assertThat(parser.findDelimiter()).isEqualTo(del);
assertThat(parser.findText()).isEqualTo(output);
}
@CsvSource를 보면 구분자(delimiter)인 : 를 통해 문자열을 세 개로 나누도록 되어있다.
의도대로라면 //;\n1;2;3 / ; / 1;2;3 으로 나눠져서 각각 text, del, output으로 들어가는게 맞는데
위와 같은 에러가 떴다.
의심가는 부분은 개행문자였는데 \r\n, \n\r, \\n으로 바꿔도 문제는 해결되지 않았다.
어디까지나 추측이지만 //;\n1;2;3:;:1;2;3으로 들어간 문자가
//;
1;2;3:;:1;2;3으로 읽혀지고 있는 느낌..이었다.
왜냐하면 에러코드를 보면 [java.lang.String arg1]이라고 되어있는데
제대로 읽혀지지도 않았다면 arg0이라고 되어있어야 하는 것 아닌가..
문자열을 한번 감싸보겠습니다..
@ParameterizedTest
@CsvSource(value = {"'//;\n1;2;3':;:1;2;3"}, delimiter = ':')
void findCustomDelimiter(String text, String del, String output){
Parser parser = new Parser(text);
assertThat(parser.findDelimiter()).isEqualTo(del);
assertThat(parser.findText()).isEqualTo(output);
}
테스트 결과는 성공인데 들어간 인자를 확인해보면 , 를 기준으로 잘 나뉜것을 확인할 수 있었다.
@ParameterizedTest는 참고로 name을 지정할 수 있는데
@ParameterizedTest(name = "테스트 {index}") 와 같이 지정할 경우 아래와 같이 테스트명이 출력된다.
@ParameterizedTest(name = "테스트 {index}"}
@ValueSource(ints = {2,4,6})
void test() {
...
}
// 테스트 1
// 테스트 2
// 테스트 3
무엇을 테스트하는지도 출력할 수 있다.
@ParameterizedTest(name = "테스트 {0}"}
@ValueSource(ints = {2,4,6})
void test() {
...
}
// 테스트 2
// 테스트 4
// 테스트 6
@CsvSource를 이용했을 때 여러 파라미터를 가질 수 있는 경우 {0}, {1}, {2}, ..와 같이 사용하면 된다.
'공부공부' 카테고리의 다른 글
공부공부-230419 (0) | 2023.04.21 |
---|---|
공부공부-230410 (0) | 2023.04.12 |
공부공부-230401 (0) | 2023.04.01 |
공부공부-230320 (0) | 2023.03.20 |
공부공부-230319 (0) | 2023.03.19 |