The @ParameterizedTest annotation lets you run the same test many times with different inputs. This helps check if your code works well for many cases without writing many tests.
@ParameterizedTest annotation in JUnit
@ParameterizedTest
@ValueSource(ints = {1, 2, 3})
void testMethodName(int parameter) {
// test code using parameter
}Use @ParameterizedTest above a test method to mark it as parameterized.
Use sources like @ValueSource to provide input values.
@ParameterizedTest
@ValueSource(strings = {"apple", "banana", "cherry"})
void testWithStrings(String fruit) {
assertNotNull(fruit);
}@ParameterizedTest
@ValueSource(ints = {10, 20, 30})
void testWithInts(int number) {
assertTrue(number > 0);
}@ParameterizedTest
@CsvSource({"apple, 5", "banana, 6", "cherry, 6"})
void testWithCsv(String fruit, int length) {
assertEquals(length, fruit.length());
}This test runs 3 times, once for each fruit name. It checks that the fruit string is not null.
import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; import static org.junit.jupiter.api.Assertions.*; public class FruitTest { @ParameterizedTest @ValueSource(strings = {"apple", "banana", "cherry"}) void testFruitIsNotNull(String fruit) { assertNotNull(fruit); } }
Use descriptive test method names to understand what is tested.
Combine @ParameterizedTest with different sources like @ValueSource, @CsvSource, or @MethodSource for flexibility.
Each test run is reported separately, making it easy to see which input failed.
@ParameterizedTest runs the same test multiple times with different inputs.
It helps test many cases without repeating code.
Use input sources like @ValueSource or @CsvSource to provide test data.
Practice
@ParameterizedTest annotation in JUnit?Solution
Step 1: Understand the role of @ParameterizedTest
The annotation allows running one test method repeatedly with different input values.Step 2: Compare with other options
Skipping tests or grouping classes are done by other annotations, not @ParameterizedTest.Final Answer:
To run the same test multiple times with different inputs -> Option DQuick Check:
@ParameterizedTest = run test with many inputs [OK]
- Confusing @ParameterizedTest with @Test
- Thinking it skips tests
- Assuming it groups test classes
@ParameterizedTest using @ValueSource?Solution
Step 1: Recall @ValueSource syntax
For integers, the correct attribute is 'ints', so @ValueSource(ints = {...}) is correct.Step 2: Check other options
'values', 'strings', and 'numbers' are invalid attributes for @ValueSource with integers.Final Answer:
@ValueSource(ints = {1, 2, 3}) -> Option AQuick Check:
Use 'ints' for integer arrays in @ValueSource [OK]
- Using 'values' instead of 'ints'
- Using 'strings' for numbers
- Using unsupported attribute names
@ParameterizedTest
@ValueSource(strings = {"apple", "banana"})
void testLength(String fruit) {
System.out.println(fruit.length());
}Solution
Step 1: Identify input values
The test runs twice with inputs "apple" and "banana".Step 2: Calculate string lengths
"apple" length is 5, "banana" length is 6, so output prints 5 then 6 on separate lines.Final Answer:
5 and 6 printed on separate lines -> Option AQuick Check:
String lengths = 5, 6 [OK]
- Mixing order of outputs
- Expecting only one print
- Assuming compilation error
@ParameterizedTest
@ValueSource(ints = {1, 2, 3})
void testIsPositive(String number) {
assertTrue(Integer.parseInt(number) > 0);
}Solution
Step 1: Check parameter type vs ValueSource
@ValueSource provides ints, but method parameter is String, causing type mismatch.Step 2: Correct parameter type
Change method parameter to int to match input type and avoid parsing.Final Answer:
Method parameter type should be int, not String -> Option BQuick Check:
Parameter type must match @ValueSource type [OK]
- Using wrong parameter type
- Forgetting @ParameterizedTest annotation
- Misusing assertTrue in parameterized tests
@ParameterizedTest with multiple inputs including 0, -2, and 3. Which of the following test method signatures and annotations correctly achieve this?Solution
Step 1: Understand input and expected output
We want to test numbers with expected boolean results, so two parameters are needed.Step 2: Check annotation and method signature
@CsvSource allows multiple parameters; method parameters match types (int, boolean) and assertion compares expected with actual.Step 3: Analyze other options
Options A and B have incorrect assertEquals argument order or logic; D uses String parameter unnecessarily.Final Answer:
Option C correctly uses @CsvSource with matching parameters and assertion -> Option CQuick Check:
Use @CsvSource for multiple inputs and expected results [OK]
- Using wrong assertEquals argument order
- Mismatching parameter types
- Using @ValueSource when multiple parameters needed
Ready to prove it?
Pass the test and this pattern moves unknown
