page-cover

title

[!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.png

[!example]

λ‹€μŒμ€ 인자의 전달 방식을 확인할 수 μžˆλŠ” κ°„λ‹¨ν•œ ν•™μŠ΅ ν…ŒμŠ€νŠΈμ΄λ‹€. MyArgumentsProviderλ₯Ό 톡해 ("a", "b"), ("c", "d") μΌ€μ΄μŠ€κ°€ μ „λ‹¬λœλ‹€.

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둜 λ³€ν™˜ν•˜λŠ” μ˜ˆμ œμ΄λ‹€.

@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.png