Skip to content

Commit eb7cde9

Browse files
alimatejzheaux
authored andcommitted
JUnit 5 parameterized tests
Issue: BAEL-1665
1 parent 8a4c326 commit eb7cde9

16 files changed

+402
-0
lines changed

testing-modules/junit-5/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@
2121
<artifactId>junit-platform-engine</artifactId>
2222
<version>${junit.platform.version}</version>
2323
</dependency>
24+
<dependency>
25+
<groupId>org.junit.jupiter</groupId>
26+
<artifactId>junit-jupiter-params</artifactId>
27+
<version>${junit.jupiter.version}</version>
28+
</dependency>
2429
<dependency>
2530
<groupId>org.junit.platform</groupId>
2631
<artifactId>junit-platform-runner</artifactId>
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.baeldung.parameterized;
2+
3+
import org.junit.jupiter.api.extension.ExtensionContext;
4+
import org.junit.jupiter.params.provider.Arguments;
5+
import org.junit.jupiter.params.provider.ArgumentsProvider;
6+
7+
import java.util.stream.Stream;
8+
9+
class BlankStringsArgumentsProvider implements ArgumentsProvider {
10+
11+
@Override
12+
public Stream<? extends Arguments> provideArguments(ExtensionContext context) {
13+
return Stream.of(
14+
Arguments.of((String) null),
15+
Arguments.of(""),
16+
Arguments.of(" ")
17+
);
18+
}
19+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.baeldung.parameterized;
2+
3+
import org.junit.jupiter.params.ParameterizedTest;
4+
import org.junit.jupiter.params.provider.CsvSource;
5+
import org.junit.jupiter.params.provider.EnumSource;
6+
7+
import java.time.Month;
8+
import java.util.EnumSet;
9+
10+
import static org.junit.jupiter.api.Assertions.assertEquals;
11+
import static org.junit.jupiter.api.Assertions.assertTrue;
12+
13+
class EnumsUnitTest {
14+
15+
@ParameterizedTest
16+
@EnumSource(Month.class)
17+
void getValueForAMonth_IsAlwaysBetweenOneAndTwelve(Month month) {
18+
int monthNumber = month.getValue();
19+
assertTrue(monthNumber >= 1 && monthNumber <= 12);
20+
}
21+
22+
@ParameterizedTest(name = "{index} {0} is 30 days long")
23+
@EnumSource(value = Month.class, names = {"APRIL", "JUNE", "SEPTEMBER", "NOVEMBER"})
24+
void someMonths_Are30DaysLong(Month month) {
25+
final boolean isALeapYear = false;
26+
assertEquals(30, month.length(isALeapYear));
27+
}
28+
29+
@ParameterizedTest
30+
@EnumSource(value = Month.class, names = {"APRIL", "JUNE", "SEPTEMBER", "NOVEMBER", "FEBRUARY"}, mode = EnumSource.Mode.EXCLUDE)
31+
void exceptFourMonths_OthersAre31DaysLong(Month month) {
32+
final boolean isALeapYear = false;
33+
assertEquals(31, month.length(isALeapYear));
34+
}
35+
36+
@ParameterizedTest
37+
@EnumSource(value = Month.class, names = ".+BER", mode = EnumSource.Mode.MATCH_ANY)
38+
void fourMonths_AreEndingWithBer(Month month) {
39+
EnumSet<Month> months = EnumSet.of(Month.SEPTEMBER, Month.OCTOBER, Month.NOVEMBER, Month.DECEMBER);
40+
assertTrue(months.contains(month));
41+
}
42+
43+
@ParameterizedTest
44+
@CsvSource({"APRIL", "JUNE", "SEPTEMBER", "NOVEMBER"})
45+
void someMonths_Are30DaysLongCsv(Month month) {
46+
final boolean isALeapYear = false;
47+
assertEquals(30, month.length(isALeapYear));
48+
}
49+
50+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.baeldung.parameterized;
2+
3+
import org.junit.jupiter.params.ParameterizedTest;
4+
import org.junit.jupiter.params.converter.ConvertWith;
5+
import org.junit.jupiter.params.provider.CsvSource;
6+
7+
import java.time.LocalDate;
8+
9+
import static org.junit.jupiter.api.Assertions.assertEquals;
10+
11+
class LocalDateUnitTest {
12+
13+
@ParameterizedTest
14+
@CsvSource({"2018/12/25,2018", "2019/02/11,2019"})
15+
void getYear_ShouldWorkAsExpected(@ConvertWith(SlashyDateConverter.class) LocalDate date, int expected) {
16+
assertEquals(expected, date.getYear());
17+
}
18+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.baeldung.parameterized;
2+
3+
public class Numbers {
4+
5+
public static boolean isOdd(int number) {
6+
return number % 2 != 0;
7+
}
8+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.baeldung.parameterized;
2+
3+
import org.junit.jupiter.params.ParameterizedTest;
4+
import org.junit.jupiter.params.provider.ValueSource;
5+
6+
import static org.junit.jupiter.api.Assertions.assertTrue;
7+
8+
class NumbersUnitTest {
9+
10+
@ParameterizedTest
11+
@ValueSource(ints = {1, 3, 5, -3, 15, Integer.MAX_VALUE})
12+
void isOdd_ShouldReturnTrueForOddNumbers(int number) {
13+
assertTrue(Numbers.isOdd(number));
14+
}
15+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.baeldung.parameterized;
2+
3+
class Person {
4+
5+
private final String firstName;
6+
private final String middleName;
7+
private final String lastName;
8+
9+
public Person(String firstName, String middleName, String lastName) {
10+
this.firstName = firstName;
11+
this.middleName = middleName;
12+
this.lastName = lastName;
13+
}
14+
15+
public String fullName() {
16+
if (middleName == null || middleName.trim().isEmpty()) return String.format("%s %s", firstName, lastName);
17+
18+
return String.format("%s %s %s", firstName, middleName, lastName);
19+
}
20+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.baeldung.parameterized;
2+
3+
import org.junit.jupiter.api.extension.ParameterContext;
4+
import org.junit.jupiter.params.aggregator.ArgumentsAccessor;
5+
import org.junit.jupiter.params.aggregator.ArgumentsAggregationException;
6+
import org.junit.jupiter.params.aggregator.ArgumentsAggregator;
7+
8+
class PersonAggregator implements ArgumentsAggregator {
9+
10+
@Override
11+
public Object aggregateArguments(ArgumentsAccessor accessor, ParameterContext context)
12+
throws ArgumentsAggregationException {
13+
return new Person(accessor.getString(1), accessor.getString(2), accessor.getString(3));
14+
}
15+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.baeldung.parameterized;
2+
3+
import org.junit.jupiter.params.ParameterizedTest;
4+
import org.junit.jupiter.params.aggregator.AggregateWith;
5+
import org.junit.jupiter.params.aggregator.ArgumentsAccessor;
6+
import org.junit.jupiter.params.provider.CsvSource;
7+
8+
import static org.junit.jupiter.api.Assertions.assertEquals;
9+
10+
class PersonUnitTest {
11+
12+
@ParameterizedTest
13+
@CsvSource({"Isaac,,Newton, Isaac Newton", "Charles,Robert,Darwin,Charles Robert Darwin"})
14+
void fullName_ShouldGenerateTheExpectedFullName(ArgumentsAccessor argumentsAccessor) {
15+
String firstName = argumentsAccessor.getString(0);
16+
String middleName = (String) argumentsAccessor.get(1);
17+
String lastName = argumentsAccessor.get(2, String.class);
18+
String expectedFullName = argumentsAccessor.getString(3);
19+
20+
Person person = new Person(firstName, middleName, lastName);
21+
assertEquals(expectedFullName, person.fullName());
22+
}
23+
24+
@ParameterizedTest
25+
@CsvSource({"Isaac Newton,Isaac,,Newton", "Charles Robert Darwin,Charles,Robert,Darwin"})
26+
void fullName_ShouldGenerateTheExpectedFullName(String expectedFullName,
27+
@AggregateWith(PersonAggregator.class) Person person) {
28+
29+
assertEquals(expectedFullName, person.fullName());
30+
}
31+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.baeldung.parameterized;
2+
3+
import org.junit.jupiter.api.extension.ParameterContext;
4+
import org.junit.jupiter.params.converter.ArgumentConversionException;
5+
import org.junit.jupiter.params.converter.ArgumentConverter;
6+
7+
import java.time.LocalDate;
8+
9+
class SlashyDateConverter implements ArgumentConverter {
10+
11+
@Override
12+
public Object convert(Object source, ParameterContext context) throws ArgumentConversionException {
13+
if (!(source instanceof String))
14+
throw new IllegalArgumentException("The argument should be a string: " + source);
15+
16+
try {
17+
String[] parts = ((String) source).split("/");
18+
int year = Integer.parseInt(parts[0]);
19+
int month = Integer.parseInt(parts[1]);
20+
int day = Integer.parseInt(parts[2]);
21+
22+
return LocalDate.of(year, month, day);
23+
} catch (Exception e) {
24+
throw new IllegalArgumentException("Failed to convert", e);
25+
}
26+
}
27+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.baeldung.parameterized;
2+
3+
import java.util.stream.Stream;
4+
5+
public class StringParams {
6+
7+
static Stream<String> blankStrings() {
8+
return Stream.of(null, "", " ");
9+
}
10+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.baeldung.parameterized;
2+
3+
class Strings {
4+
5+
static boolean isBlank(String input) {
6+
return input == null || input.trim().isEmpty();
7+
}
8+
}
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
package com.baeldung.parameterized;
2+
3+
import org.junit.jupiter.params.ParameterizedTest;
4+
import org.junit.jupiter.params.provider.*;
5+
6+
import java.util.Arrays;
7+
import java.util.List;
8+
import java.util.stream.Stream;
9+
10+
import static org.junit.jupiter.api.Assertions.assertEquals;
11+
import static org.junit.jupiter.api.Assertions.assertTrue;
12+
13+
class StringsUnitTest {
14+
15+
static Stream<Arguments> arguments = Stream.of(
16+
Arguments.of(null, true), // null strings should be considered blank
17+
Arguments.of("", true),
18+
Arguments.of(" ", true),
19+
Arguments.of("not blank", false)
20+
);
21+
22+
@ParameterizedTest
23+
@VariableSource("arguments")
24+
void isBlank_ShouldReturnTrueForNullOrBlankStringsVariableSource(String input, boolean expected) {
25+
assertEquals(expected, Strings.isBlank(input));
26+
}
27+
28+
@ParameterizedTest
29+
@ValueSource(strings = {"", " "})
30+
void isBlank_ShouldReturnTrueForNullOrBlankStrings(String input) {
31+
assertTrue(Strings.isBlank(input));
32+
}
33+
34+
@ParameterizedTest
35+
@MethodSource("provideStringsForIsBlank")
36+
void isBlank_ShouldReturnTrueForNullOrBlankStrings(String input, boolean expected) {
37+
assertEquals(expected, Strings.isBlank(input));
38+
}
39+
40+
@ParameterizedTest
41+
@MethodSource // Please note method name is not provided
42+
void isBlank_ShouldReturnTrueForNullOrBlankStringsOneArgument(String input) {
43+
assertTrue(Strings.isBlank(input));
44+
}
45+
46+
@ParameterizedTest
47+
@MethodSource("com.baeldung.parameterized.StringParams#blankStrings")
48+
void isBlank_ShouldReturnTrueForNullOrBlankStringsExternalSource(String input) {
49+
assertTrue(Strings.isBlank(input));
50+
}
51+
52+
@ParameterizedTest
53+
@ArgumentsSource(BlankStringsArgumentsProvider.class)
54+
void isBlank_ShouldReturnTrueForNullOrBlankStringsArgProvider(String input) {
55+
assertTrue(Strings.isBlank(input));
56+
}
57+
58+
private static Stream<String> isBlank_ShouldReturnTrueForNullOrBlankStringsOneArgument() {
59+
return Stream.of(null, "", " ");
60+
}
61+
62+
@ParameterizedTest
63+
@MethodSource("provideStringsForIsBlankList")
64+
void isBlank_ShouldReturnTrueForNullOrBlankStringsList(String input, boolean expected) {
65+
assertEquals(expected, Strings.isBlank(input));
66+
}
67+
68+
@ParameterizedTest
69+
@CsvSource({"test,TEST", "tEst,TEST", "Java,JAVA"}) // Passing a CSV pair per test execution
70+
void toUpperCase_ShouldGenerateTheExpectedUppercaseValue(String input, String expected) {
71+
String actualValue = input.toUpperCase();
72+
assertEquals(expected, actualValue);
73+
}
74+
75+
@ParameterizedTest
76+
@CsvSource(value = {"test:test", "tEst:test", "Java:java"}, delimiter =':') // Using : as the column separator.
77+
void toLowerCase_ShouldGenerateTheExpectedLowercaseValue(String input, String expected) {
78+
String actualValue = input.toLowerCase();
79+
assertEquals(expected, actualValue);
80+
}
81+
82+
@ParameterizedTest
83+
@CsvFileSource(resources = "/data.csv", numLinesToSkip = 1)
84+
void toUpperCase_ShouldGenerateTheExpectedUppercaseValueCSVFile(String input, String expected) {
85+
String actualValue = input.toUpperCase();
86+
assertEquals(expected, actualValue);
87+
}
88+
89+
90+
91+
private static Stream<Arguments> provideStringsForIsBlank() {
92+
return Stream.of(
93+
Arguments.of(null, true), // null strings should be considered blank
94+
Arguments.of("", true),
95+
Arguments.of(" ", true),
96+
Arguments.of("not blank", false)
97+
);
98+
}
99+
100+
private static List<Arguments> provideStringsForIsBlankList() {
101+
return Arrays.asList(
102+
Arguments.of(null, true), // null strings should be considered blank
103+
Arguments.of("", true),
104+
Arguments.of(" ", true),
105+
Arguments.of("not blank", false)
106+
);
107+
}
108+
}

0 commit comments

Comments
 (0)