JUnit параметризован в методе Before, который выполняется позже и вызывает исключение ParameterResolutionException

#testing #junit5 #parametrized-testing

Вопрос:

У меня есть тестовый класс, состоящий из метода @Before с некоторыми параметрами и других методов тестирования.

 @Before
@ParameterizedTest
@ValueSource(strings = {"123", "456"})
public void createData(String userId) {
someMethod(userId)
}


@ParameterizedTest
@ValueSource(strings = {"123", "456"})
public void abc(String userId) {}
 

но он продолжает сначала выполнять abc() и выдает ошибку

 org.junit.jupiter.api.extension.ParameterResolutionException: No ParameterResolver registered for parameter [java.lang.String arg0] in method [public void tests.xxx.createData(java.lang.String) throws java.io.IOException].
 

Я совершенно новичок в параметрах JUnit. Может ли метод Before быть одновременно параметризованным тестом? Без этой аннотации [ПараметризовАнные тесты], похоже, это работает не так, как задумывалось, но, с другой стороны, мне нужно, чтобы это выполнялось раньше всех других методов. В чем может быть проблема и каково ее решение?

Комментарии:

1. Пожалуйста, проясните, что вы действительно хотите сделать? Запускать init() метод перед каждым тестированием? В этом случае используйте @BeforeEach . Но имейте в виду, что это не тест, а просто начальная загрузка. В противном случае, если вам нужно контролировать порядок выполнения тестовых случаев, используйте @Order() аннотации к методам тестирования.

2. Мне нужно, чтобы этот метод был запущен один раз перед всеми другими методами тестирования (поэтому в данном случае я предполагаю, что мне нужно использовать @BeforeAll , но тогда он должен быть статичным или аннотированным @TestInstance(Lifecycle.PER_CLASS)) . Но также мне нужен этот @BeforeAll метод (метод инициализации), чтобы иметь параметры в точке входа

3. Параметризованные тесты предназначены для создания множества различных тестов с одинаковой логикой (методом тестирования), но разными значениями. Учитывая эту информацию, что должен делать метод before-all с параметрами, поскольку он вызывается только один раз? Какие из идентификаторов пользователей следует ввести?

4. вы правы. я просто хотел запустить его раньше остальных, поэтому я думаю, что должен пойти с @Order() ним . Но когда я пытаюсь сделать это с помощью (1), (2) и т. Д., Он отправляет первый ( createData ) и выполняет его в конце!

5. Хорошо, я добавил @TestMethodOrder(MethodOrderer.OrderAnnotation.class) , и это работает