반복되는 테스트코드를 작성하기 위한 3가지 방법

ValueSource

단순 명확하고 반복되는 테스트 케이스에 사용했습니다. 인자로는 한가지 타입밖에 받지 못하기 때문에 유연한 테스트 케이스는 아닙니다.

public class SetCollectionTest {

    private Set<Integer> numbers;

    @BeforeEach
    void setUp() {
        numbers = new HashSet<>();
        numbers.add(1);
        numbers.add(1);
        numbers.add(2);
        numbers.add(3);
    }

    @DisplayName("값이 존재하는지 확인 - 성공 케이스")
    @ParameterizedTest(name = "set has {0}? {1}")
    @ValueSource(ints = {1,2,3})
    void containsSuccess(int expected){
        assertTrue(numbers.contains(expected));
    }
}

CsvSource

actual과 expected가 동시에 존재할 때 사용했습니다. 인자를 2개까지 받을 수 있지만 인자에 클래스타입은 불가능합니다. 인자를 문자열 형태로 제공하기 때문입니다.

public class CsvSource {
    @DisplayName("문자열에 원하는 위치 지정시 문자를 반환")
    @ParameterizedTest(name = "{0}번째 문자는 {1}")
    @CsvSource(value = {"0,a", "1,b", "2,c"})
    void charAtSuccess(int index, char expected) {
        String target = "abc";
        char actual = target.charAt(index);
        assertThat(actual).isEqualTo(expected);
    }
}

MethodSource

결과 값에 단순한 값이 아닌 객체타입이 들어갈 때 사용했습니다. 테스트 메서드에 클래스 타입의 객체를 인자로 넘겨줄 수 있습니다.

public class MethodSource {
    @DisplayName("콤마를 분리")
    @ParameterizedTest(name = "\"{0}\" -> {1} ")
    @MethodSource
    void splitByComma(String target, String[] expected) {
        //when
        String[] split = target.split(",");
        //then
        assertThat(split).contains(expected);
    }

    private static Stream<Arguments> splitByComma() {
        return Stream.of(
                Arguments.of("1,2", new String[]{"1", "2"}),
                Arguments.of("1", new String[]{"1"})
        );
    }
}

댓글남기기