[이벤트 생성 API 개발]_09_매개변수를 이용한 테스트
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)
);
}