代码之家  ›  专栏  ›  技术社区  ›  user1028741

一个bean的Spring Boot-Testing-tearDown

  •  0
  • user1028741  · 技术社区  · 6 年前

    我使用@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方法只能是静态的。
    • 如果我将其设为静态,那么embeddedKafka也必须是静态的,然后@Autowired注释将不起作用。

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

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

    0 回复  |  直到 6 年前
        1
  •  1
  •   Sam Brannen    6 年前

    @AfterAll方法只能是静态的。

    那不是真的。

    JUnit 5 User Guide :

    指示在当前类中的所有@Test、@RepeatedTest、@parametedtest和@TestFactory方法之后都应执行带注释的方法;类似于JUnit 4s@after class。这些方法是继承的(除非它们被隐藏或重写),并且必须是静态的(除非使用“每类”测试实例生命周期)。

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

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