首页 > 解决方案 > Spring Boot - 测试 - 拆除 bean

问题描述

我使用 @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 bean。像这样的东西:

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

问题是:

我想我可以从其中一个测试中将 bean 转换为静态字段,然后在 tearDown() 中使用它,但这真的很难看。

在所有测试完成后仅关闭一次 bean 的“良好做法”是什么?

标签: springspring-bootjunitjunit5spring-boot-test

解决方案


@AfterAll 方法只能是静态的。

这不是真的。

JUnit 5 用户指南

表示注解的方法应该在当前类中的所有@Test、@RepeatedTest、@ParameterizedTest、@TestFactory方法之后执行;类似于 JUnit 4 的 @AfterClass。这些方法是继承的(除非它们被隐藏或覆盖)并且必须是静态的(除非使用“每类”测试实例生命周期)。

如果你使用一个@AfterAll方法可以是非静态的@TestInstance(Lifecycle.PER_CLASS)。这也记录在JUnit 5 用户指南中:

“per-class”模式比默认的“per-method”模式有一些额外的好处。具体来说,使用“per-class”模式,可以在非静态方法以及接口默认方法上声明@BeforeAll 和@AfterAll。


推荐阅读