代码之家  ›  专栏  ›  技术社区  ›  riccardo.cardin

在单元测试中与kafkamebedded一起使用时,@dirtiescontext的行为是什么?

  •  2
  • riccardo.cardin  · 技术社区  · 7 年前

    我正在开发一个应用程序的测试,它使用kafka流,也使用spring boot 1.5,它导入了 spring-kafka . 在细节上,我使用 KafkaEmbedded 以避免使用kafka的实际运行实例。

    在网上的许多例子中,我发现此类测试的配置使用注释 @DirtiesContext ,如下所示(找到 here )

    @RunWith(SpringRunner.class)
    @SpringBootTest
    @DirtiesContext
    public class SpringKafkaReceiverTest {
        private static final Logger LOGGER = LoggerFactory.getLogger(SpringKafkaReceiverTest.class);
    
        private static String RECEIVER_TOPIC = "receiver.t";
    
        @Autowired
        private Receiver receiver;
    
        private KafkaTemplate<String, String> template;
    
        @Autowired
        private KafkaListenerEndpointRegistry kafkaListenerEndpointRegistry;
    
        @ClassRule
        public static KafkaEmbedded embeddedKafka = new KafkaEmbedded(1, true, RECEIVER_TOPIC);
    
        // Rest of tests body
    }
    

    我搜了一下,但找不到要用哪一个 @肮脏的环境 . 有人能告诉我这一点吗?

    谢谢。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Gary Russell    7 年前

    当与 @ClassRule 嵌入卡夫卡, @DirtiesContext 不影响代理;代理通过 @AfterClass .

    我们通常建议使用 @肮脏的环境 在类级别,因为我们不希望测试框架缓存应用程序上下文,因为它可能有活动组件( @KafkaListener 等)。我们希望它们停止,因为当类退出时代理将被杀死。

    如果方法被标记 @肮脏的环境 在这种情况下,它没有效果。

    如果嵌入的kafka被定义为bean而不是 @ ClassRule ,它的生命周期由应用程序上下文而不是junit控制。在这种情况下,方法级别 @肮脏的环境 将停止代理以及类级批注。

        2
  •  1
  •   riccardo.cardin    7 年前

    From Spring docs :

    @DirtiesContext表示底层的SpringApplicationContext在执行测试期间被弄脏(例如,在某些mannerfor示例中,通过更改单例bean的状态而被修改或损坏),应该关闭。当应用程序上下文被标记为脏时,它将从测试框架缓存中移除并关闭。因此,对于需要具有相同配置元数据的上下文的任何后续测试,都将重建底层spring容器。

    我没有使用SpringKafka的经验,但我想他们正在使用它来清理测试生成的消息。但是如果测试套件有很多 @DirtiesContext 测试,因为没有缓存spring上下文。在更大的项目中,旋转spring上下文可能需要几分钟的时间,因此这种带注释的测试可能需要花费大量的时间。

    所以我回到 @DitriesContext 只有在没有其他选择的情况下。万一 KafkaEmbedded 我敢打赌有办法把所有的信息都扔掉 @AfterClass 测试钩。