[!quote] Definition

@ParameterizedTest is used to signal that the annotated method is a parameterized test method. ^definition

@ArgumentsProvider

[!quote] @ParameterizedTest methods must specify at least one ArgumentsProvider via @ArgumentsSource or a corresponding composed annotation(e.g., @ValueSource, @CsvSource, etc.). The provider is responsible for providing a Stream of Arguments that will be used to invoke the parameterized test method.

ํ†ต์ƒ์ ์œผ๋กœ @ArgumentProvider ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌํ˜„์ฒด๋ฅผ ์ค€๋น„ํ•˜๊ณ , @ArgumentSource ์–ด๋…ธํ…Œ์ด์…˜์œผ๋กœ ํ…Œ์ŠคํŠธ ์Šค์œ„ํŠธ์— ๋งคํ•‘ํ•˜๋Š” ๊ฒƒ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์ง„ ํ…Œ์ŠคํŠธ์˜ ๋ณธ์งˆ์ด๋‹ค. [^arguments-provider]

ArgumentProvider ์ธํ„ฐํŽ˜์ด์Šค๋Š” Stream<? extends Arguments> provideArguments(ExtensionContext context) ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ๊ทธ๋Ÿฌ๋ ค๋ฉด ๋ฐ˜ํ™˜ํ˜•์— ์‚ฌ์šฉ๋˜๋Š” Arguments์— ๋Œ€ํ•ด ์•Œ์•„์•ผ ํ•œ๋‹ค.

[!info] org.junit.jupiter.params.provider.Arguments๋Š” ๋‹จ์ˆœํžˆ Object[]๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด๋‹ค. ์ง์ ‘ get์— ๋งคํ•‘๋  ๋žŒ๋‹ค๋ฅผ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜, of, arguments ๊ฐ™์€ ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋œ๋‹ค.

arguments-definition

[!example]

๋‹ค์Œ์€ ์ธ์ž์˜ ์ „๋‹ฌ ๋ฐฉ์‹์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ ํ•™์Šต ํ…Œ์ŠคํŠธ์ด๋‹ค. MyArgumentsProvider๋ฅผ ํ†ตํ•ด ("a", "b"), ("c", "d") ์ผ€์ด์Šค๊ฐ€ ์ „๋‹ฌ๋œ๋‹ค.

java
static class MyArgumentsProvider implements ArgumentsProvider {
 @Override
 public Stream<Arguments> provideArguments(ExtensionContext context) {
  return Stream.<Arguments>builder()
    .add(Arguments.of("a", "b"))
    .add(() -> List.of("c", "d").toArray())
    .build();
 }
}

@ParameterizedTest
@ArgumentsSource(MyArgumentsProvider.class)
void parameter_withProvider(String s1, String s2) {
    // 1: s1 = "a", s2 = "b"
    // 2: s1 = "c", s2 = "d"
 assertThat(s1).isIn("a", "c");
 assertThat(s2).isIn("b", "d");
}

[!example]

ํ›„์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ArgumentConverter๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค์Œ์€ ์ „๋‹ฌ๋ฐ›์€ ๋ฌธ์ž์—ด์˜ ์ฒซ ๋ฒˆ์งธ ๋ฌธ์ž๋ฅผ ๋Œ€๋ฌธ์ž char๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์˜ˆ์ œ์ด๋‹ค.

java
@ParameterizedTest
@ArgumentsSource(MyArgumentsProvider.class)
void parameter_withProvider_andConverter(
  @ConvertWith(ToUpperChar.class) char c1,
  @ConvertWith(ToUpperChar.class) char c2
) {
 // previous test fails
 // Expecting actual: 'A' to be in: ["a", "c"]
 // Expecting actual: 'B' to be in: ["b", "d"]

 // convert String "s" to uppercase char 'S'
 assertThat(List.of(c1, c2)).satisfiesAnyOf(
   actual -> assertThat(actual).isEqualTo(List.of('A', 'B')),
   actual -> assertThat(actual).isEqualTo(List.of('C', 'D')));
}

static class ToUpperChar implements ArgumentConverter {
 @Override
 public Character convert(Object source, ParameterContext context) throws ArgumentConversionException {
  char c = String.valueOf(source).charAt(0);
  return Character.toUpperCase(c);
 }
}

[!caution] IntelliJ์˜ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์‹คํ–‰ ๋ทฐ์—์„œ๋Š” ๋‘ ์ผ€์ด์Šค ๋ชจ๋‘ ArgumentsSource ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์ถœ๋ ฅ๋œ๋‹ค. ArgumentConverter๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์‹ค์ œ ๋ฉ”์„œ๋“œ์— ์ „๋‹ฌ๋œ ๊ฐ’๊ณผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์ž.

learning-test-result