아카이브

[스프링 기반 REST API 개발] 테스트코드 리팩토링 - 파라미터 테스트 (junit-jupiter-params) 본문

Spring/스프링 기반 REST API 개발

[스프링 기반 REST API 개발] 테스트코드 리팩토링 - 파라미터 테스트 (junit-jupiter-params)

주멘이 2021. 1. 5. 23:27

기존의 테스트 코드

@Test
    void testFree() {
        // 1
        Event event = Event.builder()
                .basePrice(0)
                .maxPrice(0)
                .build();

        event.update();

        assertThat(event.isFree()).isTrue();


        // 2
        event = Event.builder()
                .basePrice(1000)
                .maxPrice(0)
                .build();

        event.update();

        assertThat(event.isFree()).isFalse();

        // 3
        event = Event.builder()
                .basePrice(0)
                .maxPrice(1000)
                .build();

        event.update();

        assertThat(event.isFree()).isFalse();
    }

    @Test
    void testOffline() {
        // 1
        Event event = Event.builder()
                .location("역삼역")
                .build();
        event.update();

        assertThat(event.isOffline()).isTrue();

        // 2
        event = Event.builder()
                .build();
        event.update();

        assertThat(event.isOffline()).isFalse();
    }

중복 코드 남발, 테스트 코드 짜기도 힘들다 --> 중복을 피하고, 파라미터를 넘겨줄 수 없을까?

params 의존성 추가

<dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-params</artifactId>
            <version>5.7.0</version>
            <scope>test</scope>
        </dependency>

 

테스트 코드 리팩터링 (파라미터)

@ParameterizedTest
    @MethodSource(value = "paramsForTestFree")
    void testFree(int basePrice, int maxPrice, boolean isFree) {
        Event event = Event.builder()
                .basePrice(basePrice)
                .maxPrice(maxPrice)
                .build();
        event.update();

        assertThat(event.isFree()).isEqualTo(isFree);
    }

    private static Object[] paramsForTestFree() {
        return new Object[]{
                new Object[]{0, 0, true},
                new Object[]{100, 0, false},
                new Object[]{0, 100, false},
                new Object[]{100, 100, false}
        };
    }

    @ParameterizedTest
    @MethodSource(value = "paramsForTestOffline")
    void testOffline(String location, boolean isOffline) {
        Event event = Event.builder()
                .location(location)
                .build();
        event.update();

        assertThat(event.isOffline()).isEqualTo(isOffline);
    }

    private static Object[] paramsForTestOffline() {
        return new Object[]{
                new Object[]{"강남", true},
                new Object[]{null, false},
                new Object[]{"   ", false},
        };
    }