This provider generates arguments dynamically from a list.
JUnit
public class DynamicArgumentsProvider implements ArgumentsProvider {
@Override
public Stream<? extends Arguments> provideArguments(ExtensionContext context) {
List<String> data = List.of("dog", "cat", "bird");
return data.stream().map(s -> Arguments.of(s, s.length()));
}
}
Sample Program
This test uses a custom argument provider that supplies pairs of words and numbers. The test checks if the word's length matches the number.
JUnit
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.ArgumentsProvider;
import org.junit.jupiter.params.provider.ArgumentsSource;
import java.util.stream.Stream;
public class CustomArgumentProviderTest {
static class NumberWordProvider implements ArgumentsProvider {
@Override
public Stream<? extends Arguments> provideArguments(ExtensionContext context) {
return Stream.of(
Arguments.of("one", 3),
Arguments.of("two", 3),
Arguments.of("three", 5)
);
}
}
@ParameterizedTest
@ArgumentsSource(NumberWordProvider.class)
void testWordLength(String word, int number) {
assertEquals(number, word.length());
}
}
OutputSuccess
Important Notes
Custom argument providers help keep tests clean and flexible.
Always return a Stream of Arguments for best compatibility.
Use @ArgumentsSource annotation to link the provider to the test.
Summary
Custom argument providers supply test data in your own way.
Implement ArgumentsProvider and override provideArguments method.
Use @ArgumentsSource to connect the provider to your parameterized test.
Practice
(1/5)
1. What is the main purpose of a custom argument provider in JUnit?
easy
A. To generate test reports
B. To create new test methods automatically
C. To supply test data to parameterized tests in a custom way
D. To replace the @Test annotation
Solution
Step 1: Understand the role of argument providers
Argument providers supply data to parameterized tests, allowing tests to run multiple times with different inputs.
Step 2: Identify the purpose of custom argument providers
Custom argument providers let you define your own way to supply test data beyond built-in sources.
Final Answer:
To supply test data to parameterized tests in a custom way -> Option C
Quick Check:
Custom argument providers = supply test data [OK]
Hint: Custom providers supply test data uniquely for parameterized tests [OK]
Common Mistakes:
Confusing argument providers with test method creators
Thinking they replace @Test annotation
Assuming they generate reports
2. Which interface must you implement to create a custom argument provider in JUnit?
easy
A. ArgumentsSource
B. ArgumentsProvider
C. TestTemplateInvocationContextProvider
D. TestInstancePostProcessor
Solution
Step 1: Recall JUnit interfaces for argument providers
The interface to implement for custom argument providers is ArgumentsProvider.
Step 2: Differentiate from other interfaces
ArgumentsSource is an annotation, not an interface. The others serve different purposes.
Final Answer:
ArgumentsProvider -> Option B
Quick Check:
Implement ArgumentsProvider for custom data [OK]
Hint: Implement ArgumentsProvider interface for custom data supply [OK]
Common Mistakes:
Confusing ArgumentsSource annotation with interface
Choosing unrelated interfaces
Not overriding provideArguments method
3. Given this custom argument provider code snippet, what will be the output when the parameterized test runs?
public class MyProvider implements ArgumentsProvider {
@Override
public Stream<Arguments> provideArguments(ExtensionContext context) {
return Stream.of(Arguments.of("apple"), Arguments.of("banana"));
}
}
@ParameterizedTest
@ArgumentsSource(MyProvider.class)
void testFruits(String fruit) {
System.out.println(fruit);
}
medium
A. apple\nbanana (each on separate lines)
B. apple banana
C. Compilation error due to missing imports
D. Runtime error due to wrong method signature
Solution
Step 1: Analyze the provideArguments method
The method returns a stream with two Arguments: "apple" and "banana".
Step 2: Understand parameterized test execution
The test runs twice, once with "apple" and once with "banana", printing each on its own line.
Final Answer:
apple\nbanana (each on separate lines) -> Option A
Quick Check:
Stream of Arguments runs test twice [OK]
Hint: Each argument runs test once, prints on separate lines [OK]
Common Mistakes:
Assuming output is on one line
Thinking code has syntax errors without imports
Confusing method signature correctness
4. Identify the error in this custom argument provider implementation:
public class BadProvider implements ArgumentsProvider {
public Stream<Arguments> provideArguments() {
return Stream.of(Arguments.of(1), Arguments.of(2));
}
}
medium
A. Method provideArguments must have ExtensionContext parameter
B. Missing @Override annotation
C. Arguments.of() cannot take integers
D. Class must extend ArgumentsSource
Solution
Step 1: Check method signature requirements
The provideArguments method must override the interface method and accept ExtensionContext as a parameter.
Step 2: Identify the missing parameter
The code's provideArguments method lacks the ExtensionContext parameter, causing a signature mismatch.
Final Answer:
Method provideArguments must have ExtensionContext parameter -> Option A
Hint: provideArguments must accept ExtensionContext parameter [OK]
Common Mistakes:
Ignoring method signature parameters
Thinking @Override is mandatory but not fixing signature
Confusing Arguments.of() usage
5. You want to create a custom argument provider that supplies pairs of integers where the second is always double the first. Which implementation correctly achieves this?
public class DoubleProvider implements ArgumentsProvider {
@Override
public Stream<Arguments> provideArguments(ExtensionContext context) {
// Fill in the blank
}
}
hard
A. return Stream.of(Arguments.of(1, 3), Arguments.of(2, 5), Arguments.of(3, 7));
B. return Stream.of(Arguments.of(1, 1), Arguments.of(2, 2), Arguments.of(3, 3));
C. return Stream.empty();
D. return Stream.of(Arguments.of(1, 2), Arguments.of(2, 4), Arguments.of(3, 6));
Solution
Step 1: Understand the requirement
Each pair must have the second integer double the first.
Step 2: Evaluate each option
return Stream.of(Arguments.of(1, 2), Arguments.of(2, 4), Arguments.of(3, 6)); correctly pairs (1,2), (2,4), (3,6). Other options provide pairs like (1,3),(2,5),(3,7) or equal numbers (1,1),(2,2),(3,3), or an empty stream.
Final Answer:
return Stream.of(Arguments.of(1, 2), Arguments.of(2, 4), Arguments.of(3, 6)); -> Option D
Quick Check:
Second integer = 2 * first integer [OK]
Hint: Check if second number is double the first in pairs [OK]
Common Mistakes:
Providing pairs where second is not double
Returning empty stream by mistake
Confusing argument order
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.