Thanks to the JUnit Parameterized Tests feature which helps us to create parameterized tests with ease. The Parameterized test class has to be annotated with the @RunWith(Parameterized.class). The parameterized test class also meets the following requirements:
- It is annotated with @RunWith(Parameterized.class).
- It has a single constructor that contains the test data.
- It has a static method which annotated with @parameters annotation and generates and returns test data. Each test data is used as a parameter for the test method.
- It needs a test method that is annotated with @test annotation.
Class Under Test: Addition.java
public class Addition {
public int AddOperation(int a, int b) {
int result = a + b;
System.out.println("Addition with: " + a + " + " + b + " = " + result);
return result;
}
}
ParameterizedTestWithConstructor.java
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import java.util.List;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@RunWith(Parameterized.class)
public class ParameterizedTestWithConstructor {
//Private variables
private int v1;
private int v2;
private int summation;
//Constructor
public ParametrizedTestWithConstructor(int p1, int p2, int p3) {
this.v1 = p1;
this.v2 = p2;
this.summation = p3;
}
//Creating test data
@Parameterized.Parameters
public static List<Object[]> data() {
Object[][] dataValues = new Object[][] { { 4, 3, 7 }, { 7, 8, 15 }, { 2, 9, 11 } };
return Arrays.asList(dataValues);
}
//Test add operation method of class Addition
@Test
public void testAddition() {
Addition add = new Addition();
assertEquals("Addition Failed!", summation, add.AddOperation(v1, v2));
System.out.println("Test for " + v1 + " and " + v2 + " has been passed!\n");
}
}It is also possible to inject data values directly into fields without needing a constructor using the @Parameter annotation.
ParameterizedTestWithParameterAnnotation.java
import static org.junit.Assert.assertEquals;
import java.util.Arrays;
import java.util.Collection;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
@RunWith(Parameterized.class)
public class ParameterizedTestWithParameterAnnotation {
//Private variables
//Variables using together with @Parameter must be public
@Parameterized.Parameter(value = 0)
public int v1;
@Parameterized.Parameter(value = 1)
public int v2;
@Parameterized.Parameter(value = 2)
public int summation;
//Creating test data
@Parameterized.Parameters
public static Collection<Object[]> data() {
Object[][] data = new Object[][] { { 4, 3, 7 }, { 7, 8, 15 }, { 2, 9, 11 } };
return Arrays.asList(data);
}
//Test addoperation method of class Addition
@Test
public void testAddition() {
Addition add = new Addition();
assertEquals("Addition Failed!", summation, add.AddOperation(v1, v2));
System.out.println("Test for " + v1 + " and " + v2 + " has been passed!\n");
}
}Output:
Addition with: 4 + 3 = 7 Test for 4 and 3 has been passed! Addition with: 7 + 8 = 15 Test for 7 and 8 has been passed! Addition with: 2 + 9 = 11 Test for 2 and 9 has been passed!
Github Page
https://github.com/swtestacademy/junit/tree/junit-parametrized-tests
Summary of JUnit Parameterized Tests
- You learned how to write parameterized tests with a constructor and without a constructor.
- You practiced with parametrized test examples.
Thanks for reading.
Onur Baskirt

Onur Baskirt is a Software Engineering Leader with international experience in world-class companies. Now, he is a Software Engineering Lead at Emirates Airlines in Dubai.

The test condition,
assertEquals(“Addition Failed!”, v1+v2, add.AddOperation(v1, v2));
has the exact same behaviour of the function tested.
If we are testing a function which sums two variables, we should give input values and the expected result. Like ~3, add.AddOperator(2, 1).
Here the test is exactly performing the same operation with the function. If one fails the other will also and we will not detect a failure. We do not expect a wrong result from v1+v2 but theoretically we should avoid testing functions with a derivative logic of themselves, here logic is the same. I have seen many people used to do that but this is basically not testing the method especially when methods/functions are more complex.
Hi Mehmet,
I totally agree with you. I will fix the code. Thanks for the feedback.
Code fixed. @Mehmet, thank you again.
Test King
Thanks Ulvi :) You are the Test Hero!