Spring Boot - 测试 - 拆除 bean

Posted

技术标签:

【中文标题】Spring Boot - 测试 - 拆除 bean【英文标题】:Spring Boot - Testing - tearDown for a bean 【发布时间】:2019-07-22 21:47:21 【问题描述】:

我使用@EmbeddedKafka注解如下有一个kafka mock:

@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);
    

问题是:

@AfterAll 方法只能是静态的。 如果我将其设为静态 - 那么嵌入式Kafka 也必须是静态的,然后 @Autowired 注释将不起作用。

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

在所有测试完成后只关闭一次 bean 的“好习惯”是什么?

【问题讨论】:

或许能帮上忙:concretepage.com/testing/junit-5/… 您是否尝试过使用@ClassRule 创建嵌入式Kafka 而不是自动连接@Autowired embeddedKafka? 【参考方案1】:

@AfterAll 方法只能是静态的。

这不是真的。

来自JUnit 5 User Guide:

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

如果您使用@TestInstance(Lifecycle.PER_CLASS)@AfterAll 方法可以是非静态的。这也记录在JUnit 5 User Guide:

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

【讨论】:

以上是关于Spring Boot - 测试 - 拆除 bean的主要内容,如果未能解决你的问题,请参考以下文章

03-Spring Boot常用注解解读

如何禁用spring boot HibernateJpaAutoConfiguration

Spring Boot BigQuery 数据源连接

Spring Boot实战笔记-- Spring高级话题(条件注解@Conditional)

启动spring boot应用程序时bean创建错误

spring boot由浅入深jdk安装