1. Анотація @ParameterizedTest
Іноді просто хочеться викликати тест кілька разів із різними параметрами: різні значення, різні вхідні параметри, різні імена користувачів. JUnit прагне спростити тобі життя, тому на цей випадок у нього є така річ як параметризовані тести.
Для використання параметризованих тестів треба додати ще одну залежність до твого pom.xml
:
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-params</artifactId>
<version>5.8.2</version>
<scope>test</scope>
</dependency>
Після цього можемо розглянути приклад:
@ParameterizedTest
@ValueSource(ints = { 1, 2, 3 })
void testMethod(int argument) {
//test code
}
@ParameterizedTest
@ValueSource(ints = { 1, 2, 3 })
void testMethodWithAutoboxing(Integer argument) {
//test code
}
Кожен тестовий метод викликається по 3 рази і при кожному виклику до нього передається черговий параметр. Значення встановлюються за допомогою іншої анотації – @ ValueSource. Але про неї треба розповісти докладніше.
2. Анотація @ValueSource
Анотація @ValueSource чудово підходить для роботи з примітивами та літералами. Просто перерахуй значення параметра через кому, і тест викличеться по одному разу для кожного значення.
@ParameterizedTest
@ValueSource(ints = { 1, 2, 3 })
void testMethodWithAutoboxing(Integer argument) {
//test code
}
Але є і мінус – ця анотація не підтримує null, отже потрібно буде використовувати спеціальний костиль – @ NullSource. Виглядає це так:
@ParameterizedTest
@NullSource
void testMethodNullSource(Integer argument) {
assertTrue(argument == null);
}
3. Анотація @EnumSource
Також є спеціальна анотація @EnumSource, яка передає до методу всі значення певного Enum. Її застосування виглядає так:
enum Direction {
EAST, WEST, NORTH, SOUTH
}
@ParameterizedTest
@EnumSource(Direction.class)
void testWithEnumSource(Direction d) {
assertNotNull(d);
}
4. Анотація @MethodSource
А яким чином передавати об'єкти як параметри? Особливо якщо вони мають складний алгоритм побудови. Для цього можна просто вказати спеціальний допоміжний метод, який повертатиме список (Stream) з таких значень.
Приклад:
@ParameterizedTest
@MethodSource("argsProviderFactory")
void testWithMethodSource(String argument) {
assertNotNull(argument);
}
static Stream<String> argsProviderFactory() {
return Stream.of("один", "два", "три");
}
5. Параметризовані тести з кількома аргументами
А якщо в метод хочеться передати кілька параметрів? Для цього є дуже класна анотація @CSVSource. Вона дозволяє перерахувати значення параметрів методу просто через кому.
Приклад:
@ParameterizedTest
@CsvSource({
"alex, 30, Програміст, Працює",
"brian, 35, Тестувальник, Працює",
"charles, 40, Менеджер, Перевіряє"
})
void testWithCsvSource(String name, int age, String occupation, String status) {
//код методу
}
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ