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的主要内容,如果未能解决你的问题,请参考以下文章
如何禁用spring boot HibernateJpaAutoConfiguration