5.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. Но о ней нужно рассказать подробнее.
5.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);
}
5.3 Аннотация @EnumSource
Также есть специальная аннотация @EnumSource, которая передает в метод все значения определенного Enum’а. Ее применение выглядит так:
enum Direction {
EAST, WEST, NORTH, SOUTH
}
@ParameterizedTest
@EnumSource(Direction.class)
void testWithEnumSource(Direction d) {
assertNotNull(d);
}
5.4 Аннотация @MethodSource
А как же передавать в качестве параметров объекты? Особенно, если они имеют сложный алгоритм построения. Для этого можно просто указать специальный вспомогательный метод, который будет возвращать список (Stream) из таких значений.
Пример:
@ParameterizedTest
@MethodSource("argsProviderFactory")
void testWithMethodSource(String argument) {
assertNotNull(argument);
}
static Stream<String> argsProviderFactory() {
return Stream.of("один", "два", "три");
}
Параметризованные тесты с несколькими аргументами
Конечно вы уже задались вопросом, а что делать, если в метод хочется передать несколько параметров. Для этого есть очень классная аннотация @CSVSource. Она позволяет перечислить значения параметров метода просто через запятую.
Пример:
@ParameterizedTest
@CsvSource({
"alex, 30, Программист, Работает",
"brian, 35, Тестировщик, Работает",
"charles, 40, Менеджер, Пинает"
})
void testWithCsvSource(String name, int age, String occupation, String status) {
//код метода
}
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ