[!quote] Definition
@ParameterizedTestis used to signal that the annotated method is a parameterized test method. ^definition
@ArgumentsProvider
[!quote]
@ParameterizedTestmethods must specify at least oneArgumentsProvidervia@ArgumentsSourceor a corresponding composed annotation(e.g.,@ValueSource,@CsvSource, etc.). The provider is responsible for providing aStreamofArgumentsthat 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๊ฐ์ ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ํ์ฉํ๋ฉด ๋๋ค.
[!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๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ค์ ๋ฉ์๋์ ์ ๋ฌ๋ ๊ฐ๊ณผ ๋ฌ๋ผ์ง ์ ์๋ค๋ ์ ์ ์ ์ํ์.

