我正在开发一些使用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
的目的。有人可以澄清这一点吗?
非常感谢。
答案 0 :(得分:2)
当与@ClassRule
嵌入式kafka一起使用时,@DirtiesContext
不会影响代理;经纪人通过@AfterClass
停止。
我们通常建议在类级别使用@DirtiesContext
,因为我们不希望测试框架缓存应用程序上下文,因为它可能具有活动组件(@KafkaListener
等)。我们希望他们停止,因为当课程退出时,经纪人将被杀死。
如果某种方法在这种情况下标记为@DirtiesContext
,则无效。
如果嵌入式kafka被定义为bean而不是@ClassRule
,则其生命周期由应用程序上下文而不是JUnit控制。在这种情况下,方法级别@DirtiesContext
将停止代理以及类级别注释。
答案 1 :(得分:1)
@DirtiesContext表示在执行测试期间底层Spring ApplicationContext已被弄脏(即,以某种方式修改或损坏 - 例如,通过更改单例bean的状态)并应该关闭。当应用程序上下文标记为脏时,它将从测试框架的缓存中删除并关闭。因此,对于需要具有相同配置元数据的上下文的任何后续测试,将重建基础Spring容器。
我没有使用spring-kafka的经验,但我猜他们正在使用它来清理测试生成的消息。但是,对于测试套件来说,进行大量@DirtiesContext
测试会非常浪费,因为Spring上下文没有被缓存。在较大的项目中,可能需要几分钟才能启动Spring上下文,因此这种带注释的测试可能需要花费很多时间。
因此,只有在没有其他选项的情况下,才会回退到@DitriesContext
。在KafkaEmbedded
的情况下,我打赌有办法丢弃@AfterClass
测试挂钩中的所有消息。