Spring Boot — Тестирование — tearDown для бина

Я использую аннотацию @EmbeddedKafka следующим образом, чтобы создать макет kafka:

@ExtendWith(SpringExtension.class)
@SpringBootTest
@EmbeddedKafka(partitions = 1,
    topics = {"topic"},
    brokerProperties = {
        "auto.create.topics.enable=${topics.autoCreate:false}",
        "delete.topic.enable=${topic.delete:true}",
        "broker.id=2"})
public class KafkaUsersTest {
    @Autowired
    private EmbeddedKafkaBroker embeddedKafka;

    @Test
    public void test1() {
        // test something
    }

    @Test
    public void test2() {
        // test something
    }

    ...
}

Теперь, после завершения тестов, я хотел бы закрыть встроенный компонент Kafka. Что-то вроде этого:

    @AfterAll
    public void tearDown(){
        embeddedKafka.getKafkaServers().forEach(KafkaServer::shutdown);
        embeddedKafka.getKafkaServers().forEach(KafkaServer::awaitShutdown);
    }

Проблема в:

  • Метод @AfterAll может быть только статическим.
  • Если я сделаю ее статической — то и embeddedKafka должна быть статической, и тогда аннотация @Autowired работать не будет.

Я думаю, что могу передать bean-компонент в статическое поле из одного из тестов, а затем использовать его в tearDown(), но это действительно уродливо.

Какова "хорошая практика" закрытия bean-компонента только один раз после завершения всех тестов?


person user1028741    schedule 28.02.2019    source источник
comment
Вероятно, это может помочь: бетонная страница .com/testing/junit-5/   -  person amseager    schedule 01.03.2019
comment
Пробовали ли вы использовать @ClassRule для создания встроенной Kafka, а не для автоматического подключения @Autowired embeddedKafka?   -  person alltej    schedule 04.03.2019


Ответы (1)


Метод @AfterAll может быть только статическим.

Это не правда.

Из Руководства пользователя JUnit 5:

Указывает, что аннотированный метод должен выполняться после всех методов @Test, @RepeatedTest, @ParameterizedTest и @TestFactory в текущем классе; аналогично @AfterClass в JUnit 4. Такие методы наследуются (если они не скрыты или не переопределены) и должны быть статическими (если только не используется жизненный цикл экземпляра теста «для каждого класса»).

Метод @AfterAll может быть нестатическим, если вы используете @TestInstance(Lifecycle.PER_CLASS). Это также задокументировано в JUnit 5 User Руководство:

Режим «на класс» имеет некоторые дополнительные преимущества по сравнению с режимом «на метод» по умолчанию. В частности, в режиме «для каждого класса» становится возможным объявлять @BeforeAll и @AfterAll для нестатических методов, а также для методов интерфейса по умолчанию.

person Sam Brannen    schedule 01.03.2019