Можно ли параметризовать @BeforeEach, то есть вызывать другой @BeforeEach в зависимости от параметра, заданного каждым @Test? - PullRequest
1 голос
/ 30 октября 2019

Я пытаюсь написать тестовый класс, который требует использования определенной настройки. Когда есть только 1 настройка, это легко с @BeforeEach:

@BeforeEach public void setup() {
  // my setup code
}

@Test public void test1() {
  // ...
}

@Test public void test2() {
  // ...
}

@Test public void test3() {
  // ...
}

Но что я могу сделать, когда есть несколько настроек на выбор? Конечно, я мог бы вообще забыть @BeforeEach и попросить коллег вызвать метод установки, который они хотели бы использовать:

@Test public void test1() {
  setupA();
  // ...
}

@Test public void test2() {
  setupB();
  // ...
}

@Test public void test3() {
  setupB();
  // ...
}

Но это больше не заставляет использовать один измои методы настройки. Есть ли способ реализовать «параметризованный @BeforeEach»? Что-то вроде (составной синтаксис):

enum SetupType {A, B, C};

@BeforeEach public void setup(SetupType setupType) {
  switch (setupType) {
  case A:
    setupA();
    break;
  case B:
    setupB();
    break;
  case C:
    setupC();
    break;
  default:
    fail("Unrecognized setup.");
}

@Test
@BeforeEachParameter(SetupType.A)
public void test1() {
  // ...
}

@Test
@BeforeEachParameter(SetupType.B)
public void test2() {
  // ...
}

@Test
@BeforeEachParameter(SetupType.B)
public void test3() {
  // ...
}

Или, что еще лучше, добавление в аннотацию @Test?

@TestWithSetupA public void test1() {
  // ...
}

@TestWithSetupB public void test2() {
public void test2() {
  // ...
}

@TestWithSetupB public void test3() {
public void test3() {
  // ...
}

1 Ответ

2 голосов
/ 30 октября 2019

да, и это действительно довольно просто. Вы можете использовать тестовую аннотацию Теги и в каждой перед установкой вставлять объект TestInfo , но вам потребуется JUnit 5.

Вот рабочий JUnit

public class TestBeforeEach {

@BeforeEach
public void setUp(TestInfo testInfo) {
    System.out.println(testInfo.getTags());
}

@Test
@Tag( "setup1" )
public void test1() {

}

@Test
@Tag( "setup2" )
public void test2() {

}

Надеюсь, это поможет. Ура!

...