Эти JUnit-ы сменяют друг друга как очумелые. Я как-то писал статью про то, как можно подружить Mockito, junitdataprovider и JUnit 4. В пятой версии JUnit параметризованные тесты уже выглядят гораздо лучше, чем раньше, поэтому смысла подключать junitdataprovider больше нет.
Напишем небольшой пример параметризованного теста. Для начала добавим необходимые зависимости:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-engine</artifactId> <version>5.7.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter-params</artifactId> <version>5.7.0</version> <scope>test</scope> </dependency> |
Зависимость junit-jupiter-engine подключает сам JUnit, а junit-jupiter-params нужна для возможности написания параметризованных тестов.
Класс, который будем тестировать:
1 2 3 4 5 6 7 |
public class MyObject { public int method1(int a, int b) { return a + b; } } |
При написании тестов нам достаточно использовать аннотацию @ParameterizedTest, чтобы указать, что это тест с параметрами. Затем мы можем использовать аннотации вида @ValueSource, @EmptySource, @NullSource… Но мы будем использовать аннотацию @MethodSource, с помощью которой получим код практически идентичный тому, что был в примере с junitdataprovider.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; import ru.urvanov.javaexamples.junit5.MyObject; import java.util.stream.Stream; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.params.provider.Arguments.arguments; public class JUnit5DataProviderExample { private MyObject myObject = new MyObject(); @ParameterizedTest @MethodSource("method1DataProvider") public void method1(int expected, int param1, int param2) { assertEquals(expected, myObject.method1(param1, param2)); } static Stream<Arguments> method1DataProvider() { return Stream.of( arguments(10, 7, 3), arguments(15, 10, 5) ); } } |
В методе method1DataProvider() мы описываем аргументы для нашего теста. В метод они передадутся в том же порядке, в котором перечислены. Сначала в expected передастся 10, в param1 передастся 7, в param2 передастся 3. Затем в expected передастся 15, в param1 передастся 10, в param2 передастся 5.