가능한 최신 버전을 사용하는 걸 좋아한다.
국내 자료로 학습을 하면 아직까지는 많은 자료들이 Junit4 기준으로 설명이 되어 있다.
하지만 현재는 Junit5를 사용하고 있는데,
파라미터 테스트의 경우 활용할 일이 많을 것 같아 Junit5를 기준으로 찾은 내용을 정리해 본다.
참고로 Junit4의 경우 사용하는 어노테이션 자체가 다르다.
가장 큰 차이점은 Junit5 부터는 @ParameterizedTest를 사용한다는 것이다.
JUnitParams을 먼저 추가해 주어야 한다.
https://mvnrepository.com/artifact/pl.pragmatists/JUnitParams
메이븐, 그래들 등 환경에 맞춰서 의존성을 추가해 주자.
그냥 한번만 보면 바로 이해가 될 것 같다.
// Junit 5 기준
@ParameterizedTest(name = "{index} => basePrice={0}, maxPrice={1}, isFree={2}")
@CsvSource({
"0, 0, true",
"100, 0, falae",
"0, 1000, falae"
})
public void testFree(int basePrice, int maxPrice, boolean isFree){
System.out.println(basePrice);
// Given
Event event = Event.builder()
.basePrice(basePrice)
.maxPrice(maxPrice)
.build();
//When
event.update();
// Then
assertThat(event.isFree()).isEqualTo(isFree);
}
저렇게 활용하면 전혀 type-safe하지 않기 때문에, 메서드를 활용하는 방법도 존재한다.
// Junit 5 기준
@ParameterizedTest(name = "{index} => basePrice={0}, maxPrice={1}, isFree={2}")
@MethodSource("testFreeParams")
public void testFree(int basePrice, int maxPrice, boolean isFree){
System.out.println(basePrice);
// Given
Event event = Event.builder()
.basePrice(basePrice)
.maxPrice(maxPrice)
.build();
//When
event.update();
// Then
assertThat(event.isFree()).isEqualTo(isFree);
}
// static 있어야 동작
private static Object[] testFreeParams() {
return new Object[]{
new Object[]{0, 0, true},
new Object[]{100, 0, false},
new Object[]{0, 100, false}
};
}
// 외국 문서들에서는 스트림을 활용하는 경우가 많았다.
/*
private static Stream<Arguments> sumProvider() {
return Stream.of(
Arguments.of(1, 1, 2),
Arguments.of(2, 3, 5)
);
}
*/
추가적으로 좀 더 살펴보자면
Enum 을 활용하는 방법 또한 존재한다. (문서로 보고 궁금해서 직접 구현해 보았다.)
public enum ProductType {
CLASS(Class.PRODUCT_TYPE_VALUE, Class.PRODUCT_TYPE_ENG_NAME, Class.PRODUCT_TYPE_KOR_NAME),
KIT(Kit.PRODUCT_TYPE_VALUE, Kit.PRODUCT_TYPE_ENG_NAME, Kit.PRODUCT_TYPE_KOR_NAME);
private final String typeValue;
private final String typeEngName;
private final String typeKorName;
...
@DisplayName("ProductType Enum 확인")
@ParameterizedTest(name = "{index} => productType='{0}'")
@EnumSource(ProductType.class)
void test(ProductType productType) {
assertNotNull(productType);
}
ProductType 로 바로 받아오는 걸 확인할 수 있다.
찍어보니 이늄 수(코드 수)만큼 도는것 확인했다.
또한 .csv 파일로 바로 받아오는 것도 가능하다.
@ParameterizedTest(name = "{index} => a={0}, b={1}, sum={2}")
@CsvFileSource(resources = "/test-data.csv")
void sum(int a, int b, int sum) {
assertEquals(sum, a + b);
}