Test Overview
This test uses JUnit's @ArgumentsSource annotation with a custom provider to supply multiple sets of arguments. It verifies that the tested method correctly processes each input and produces the expected output.
This test uses JUnit's @ArgumentsSource annotation with a custom provider to supply multiple sets of arguments. It verifies that the tested method correctly processes each input and produces the expected output.
import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.ArgumentsSource; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.params.provider.ArgumentsProvider; import java.util.stream.Stream; public class CustomArgumentsSourceTest { static class CustomProvider implements ArgumentsProvider { @Override public Stream<? extends Arguments> provideArguments(ExtensionContext context) { return Stream.of( Arguments.of(2, 4), Arguments.of(3, 9), Arguments.of(4, 16) ); } } @ParameterizedTest @ArgumentsSource(CustomProvider.class) void testSquareFunction(int input, int expected) { int actual = input * input; Assertions.assertEquals(expected, actual, "Square calculation failed"); } }
| Step | Action | System State | Assertion | Result |
|---|---|---|---|---|
| 1 | Test starts | JUnit test runner initialized | — | PASS |
| 2 | JUnit identifies @ParameterizedTest with @ArgumentsSource(CustomProvider.class) | Test method 'testSquareFunction' ready to run with arguments from CustomProvider | — | PASS |
| 3 | CustomProvider.provideArguments() called to supply test arguments | Stream of Arguments: (2,4), (3,9), (4,16) | — | PASS |
| 4 | Test method invoked with input=2, expected=4 | Calculating 2 * 2 | Assert actual (4) equals expected (4) | PASS |
| 5 | Test method invoked with input=3, expected=9 | Calculating 3 * 3 | Assert actual (9) equals expected (9) | PASS |
| 6 | Test method invoked with input=4, expected=16 | Calculating 4 * 4 | Assert actual (16) equals expected (16) | PASS |
| 7 | All parameterized test cases completed | Test run summary available | — | PASS |
@ArgumentsSource in JUnit tests?@ArgumentsSourceArgumentsProvider.@ArgumentsSource.ArgumentsProvider -> Option B@ArgumentsSource supplies custom test data [OK]@ArgumentsSource links to custom data providers [OK]@ArgumentsSource with @DisabledArgumentsProvider class for use with @ArgumentsSource?ArgumentsProvider and override provideArguments(ExtensionContext) returning a Stream<Arguments>.ArgumentsSource which is an annotation, not an interface. public class MyProvider implements ArgumentsProvider { public List<Arguments> provideArguments() { return List.of(Arguments.of(1)); } } returns a List instead of a Stream.ArgumentsProvider with correct method signature [OK]ArgumentsProvider with provideArguments(ExtensionContext) [OK]ArgumentsProviderArgumentsSource annotation with interfacepublic class NumberProvider implements ArgumentsProvider {
public Stream<Arguments> provideArguments(ExtensionContext context) {
return Stream.of(Arguments.of(2), Arguments.of(4));
}
}
@ParameterizedTest
@ArgumentsSource(NumberProvider.class)
void testIsEven(int number) {
assertTrue(number % 2 == 0);
}ArgumentsProvider implementation:public class StringProvider implements ArgumentsProvider {
public List<Arguments> provideArguments(ExtensionContext context) {
return List.of(Arguments.of("test"));
}
}provideArgumentsArgumentsProvider interface requires provideArguments to return a Stream<Arguments>, but the code returns a List<Arguments>.ArgumentsProvider and the method name is correct.provideArguments returns Stream, not List [OK]@ArgumentsSource with a custom provider that supplies pairs. Which of the following ArgumentsProvider implementations correctly provides pairs of integers for the test?Arguments must supply two integers.Pass the test and this pattern moves unknown