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

时间:2018-06-05 10:06:03

标签: java spring spring-boot apache-kafka spring-kafka

我正在开发一些使用Kafka-stream的应用程序的测试,该应用程序也使用Spring Boot 1.5,它导入KafkaEmbedded的1.2版本。具体来说,我使用@DirtiesContext来避免使用真正运行的Kafka实例。

在网上的许多示例中,我发现此类测试的配置使用注释@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 } ,如下所示(找到here

@DirtiesContext

我用谷歌搜索了一下,但我找不到使用cellForRowAt的目的。有人可以澄清这一点吗?

非常感谢。

2 个答案:

答案 0 :(得分:2)

当与@ClassRule嵌入式kafka一起使用时,@DirtiesContext不会影响代理;经纪人通过@AfterClass停止。

我们通常建议在类级别使用@DirtiesContext,因为我们不希望测试框架缓存应用程序上下文,因为它可能具有活动组件(@KafkaListener等)。我们希望他们停止,因为当课程退出时,经纪人将被杀死。

如果某种方法在这种情况下标记为@DirtiesContext,则无效。

如果嵌入式kafka被定义为bean而不是@ClassRule,则其生命周期由应用程序上下文而不是JUnit控制。在这种情况下,方法级别@DirtiesContext将停止代理以及类级别注释。

答案 1 :(得分:1)

From Spring docs

  

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

我没有使用spring-kafka的经验,但我猜他们正在使用它来清理测试生成的消息。但是,对于测试套件来说,进行大量@DirtiesContext测试会非常浪费,因为Spring上下文没有被缓存。在较大的项目中,可能需要几分钟才能启动Spring上下文,因此这种带注释的测试可能需要花费很多时间。

因此,只有在没有其他选项的情况下,才会回退到@DitriesContext。在KafkaEmbedded的情况下,我打赌有办法丢弃@AfterClass测试挂钩中的所有消息。