spring - 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);
}
问题是:
- @AfterAll 方法只能是静态的。
- 如果我将其设为静态 - 那么嵌入式Kafka 也必须是静态的,然后 @Autowired 注释将不起作用。
我想我可以从其中一个测试中将 bean 转换为静态字段,然后在 tearDown() 中使用它,但这真的很难看。
在所有测试完成后仅关闭一次 bean 的“良好做法”是什么?
解决方案
@AfterAll 方法只能是静态的。
这不是真的。
表示注解的方法应该在当前类中的所有@Test、@RepeatedTest、@ParameterizedTest、@TestFactory方法之后执行;类似于 JUnit 4 的 @AfterClass。这些方法是继承的(除非它们被隐藏或覆盖)并且必须是静态的(除非使用“每类”测试实例生命周期)。
如果你使用一个@AfterAll
方法可以是非静态的@TestInstance(Lifecycle.PER_CLASS)
。这也记录在JUnit 5 用户指南中:
“per-class”模式比默认的“per-method”模式有一些额外的好处。具体来说,使用“per-class”模式,可以在非静态方法以及接口默认方法上声明@BeforeAll 和@AfterAll。
推荐阅读
- sql - oracle sql - 如何从某些范围内获取具有最大值的记录
- php - Symfony 3.4 用 parameters.yml 中的变量覆盖环境变量
- c# - 此代码中的“程序集”有什么用途?
- java - Intellij Idea Run/Debug 配置和 Gradle 任务中的 SSH 隧道
- dialogflow-es - Dialogflow 无法再在 slack 上进行测试?
- python - 将看起来像列表[字典]的字符串转换为python列表[字典]类型数据
- javascript - 使用 php 从数组创建一个 json 文件,将其返回并与 wordpress 中的 javascript 文件中的 javascript 一起使用
- elasticsearch - 使用不同大小的搜索文本在弹性搜索中搜索最佳字段
- python - Python:对包含基类的项目进行鼻子测试
- reporting-services - 如何在 SSRS 报告中显示欧元货币代码