[이벤트 생성 API 개발]_09_매개변수를 이용한 테스트

1 minute read

Event 생성 API 구현: 매개변수를 이용한 테스트

테스트 코드 리팩토링

  • 테스트에서 중복 코드 제거
  • 매개변수만 바꿀 수 있으면 좋겠는데?
  • JUnitParams 이용 (여러가지 방법이 있다.)

JUnitParams

  • https://github.com/Pragmatists/JUnitParams
<!-- https://mvnrepository.com/artifact/pl.pragmatists/JUnitParams -->
<dependency>
    <groupId>pl.pragmatists</groupId>
    <artifactId>JUnitParams</artifactId>
    <version>1.1.1</version>
    <scope>test</scope>
</dependency>

테스트 코드 리팩토링

  • 파라미터 값이 type safe 하지 않다.
@Test
@Parameters({
        "0, 0, true",
        "100, 0, false",
        "0, 100, false"
})
@TestDescription("free 여부가 맞는지 확인")
public void testFree(int basePrice, int maxPrice, boolean isFree) {
    // Given
    Event event = Event.builder()
            .basePrice(basePrice)
            .maxPrice(maxPrice)
            .build();

    // When
    event.update();

    // Then
    assertThat(event.isFree()).isEqualTo(isFree);
  • type safe 하게 리팩토링

  • parametersFor테스트명() 이름으로 파리미터에 넣어줄 값을 반환하는 메서드를 작성하면 @Parameters()에 메서드명을 생략할 수 있다.

@Test
@Parameters(method = "parametersForTestFree") //컨벤션에 맞는 메서드명인 경우 method 생략가능
@TestDescription("free 여부가 맞는지 확인")
public void testFree(int basePrice, int maxPrice, boolean isFree) {
    // Given
    Event event = Event.builder()
            .basePrice(basePrice)
            .maxPrice(maxPrice)
            .build();

    // When
    event.update();

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

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

JUnit 5 파라미터 테스트

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

  // when
  event.update();

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

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

  // when
  event.update();

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

private static Stream<Arguments> paramsForTestFree() { // argument source method
  return Stream.of(
    Arguments.of(0,0, true),
    Arguments.of(100, 0, false),
    Arguments.of(0, 100, false),
    Arguments.of(100, 200, false)
  );
}

private static Stream<Arguments> paramsForTestOffline() { // argument source method
  return Stream.of(
    Arguments.of("강남", true),
    Arguments.of(null, false),
    Arguments.of("        ", false)
  );
}