@CsvSource for inline CSV data in JUnit - Build an Automation Script
import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import static org.junit.jupiter.api.Assertions.assertEquals; public class CalculatorTest { // Method to test public int add(int a, int b) { return a + b; } @ParameterizedTest(name = "add({0}, {1}) = {2}") @CsvSource({ "1, 2, 3", "5, 7, 12", "10, 15, 25", "0, 0, 0", "-1, 1, 0" }) void testAdd(int a, int b, int expectedSum) { assertEquals(expectedSum, add(a, b)); } }
This test class CalculatorTest contains a simple add method to add two integers.
The test method testAdd is annotated with @ParameterizedTest and @CsvSource to provide multiple sets of input data inline as CSV strings.
Each CSV row has three values: the first two are inputs a and b, and the third is the expected sum.
The test runs once for each CSV row, calling add(a, b) and asserting the result equals expectedSum.
This approach keeps the test concise, readable, and easy to add more test cases by just adding more CSV lines.
Now add data-driven testing with 3 different inputs including negative numbers and zero
Practice
What is the main purpose of using @CsvSource in JUnit tests?
Solution
Step 1: Understand the role of @CsvSource
@CsvSource allows specifying multiple sets of input data inline for a single test method.Step 2: Identify the purpose in testing
This lets the test run repeatedly with each data set, checking behavior for different inputs.Final Answer:
To run the same test multiple times with different input data -> Option AQuick Check:
@CsvSource runs tests with multiple inputs [OK]
- Thinking @CsvSource connects to databases
- Confusing it with random data generation
- Assuming it creates UI elements
Which of the following is the correct syntax to use @CsvSource for a test method with two parameters int a and int b?
@ParameterizedTest
@CsvSource({"1, 2", "3, 4"})
void testSum(int a, int b) { ... }Solution
Step 1: Check the delimiter used in @CsvSource
The default delimiter for @CsvSource is a comma (,), so values should be separated by commas.Step 2: Match the syntax with parameters
Since the method expects two int parameters, each CSV line must have two comma-separated values.Final Answer:
@CsvSource({"1, 2", "3, 4"}) -> Option BQuick Check:
Comma separates values in @CsvSource [OK]
- Using semicolons or spaces instead of commas
- Using wrong delimiters like |
- Not matching parameter count with CSV values
What will be the output of the following JUnit test when run with @CsvSource?
@ParameterizedTest
@CsvSource({"2, 3, 5", "4, 5, 9", "1, 1, 3"})
void testAdd(int a, int b, int expected) {
assertEquals(expected, a + b);
}Solution
Step 1: Evaluate each test case
Test 1: 2 + 3 = 5 matches expected 5 (pass) Test 2: 4 + 5 = 9 matches expected 9 (pass) Test 3: 1 + 1 = 2 does not match expected 3 (fail)Step 2: Determine overall result
Since one test fails, the test suite reports failure for that case.Final Answer:
The last test fails -> Option DQuick Check:
Check sums against expected values [OK]
- Assuming all tests pass without checking expected values
- Ignoring the last test case
- Confusing parameter order
Identify the error in this JUnit test using @CsvSource:
@ParameterizedTest
@CsvSource({"apple, 1", "banana"})
void testFruitCount(String fruit, int count) {
assertTrue(count > 0);
}Solution
Step 1: Check CSV lines against method parameters
The method expects two parameters: a String and an int. The first CSV line has two values, but the second line has only one.Step 2: Understand the impact of missing value
Missing the second value in the second line causes a runtime error because the test cannot map parameters properly.Final Answer:
Missing second value in second CSV line causes error -> Option CQuick Check:
Each CSV line must have values matching parameters [OK]
- Ignoring missing values in CSV lines
- Assuming assertTrue usage causes error
- Thinking @CsvSource limits lines to one
You want to test a method isAdult(int age) that returns true if age is 18 or more, false otherwise. Which @CsvSource usage correctly tests ages 17, 18, and 20 with expected results?
Solution
Step 1: Use correct delimiter for @CsvSource
The default delimiter is a comma, so values must be comma-separated.Step 2: Match test data with method parameters
Each line has an int age and a boolean expected result, correctly formatted with commas.Final Answer:
@CsvSource({"17, false", "18, true", "20, true"}) -> Option AQuick Check:
Comma-separated values match parameters and expected results [OK]
- Using semicolons or spaces instead of commas
- Using wrong delimiters like |
- Not matching parameter count or types
Ready to prove it?
Pass the test and this pattern moves unknown
