Spring boot 在Kafkalistener集成测试中捕获异常

Spring boot 在Kafkalistener集成测试中捕获异常,spring-boot,junit,spring-kafka,spring-kafka-test,Spring Boot,Junit,Spring Kafka,Spring Kafka Test,因此,我需要为我的kafkalistener方法创建一个集成测试,测试期望ListenerExecutionFailedException实际被抛出,因为消息在使用过程中由于另一个服务处于非活动状态而失败 下面是测试代码,我使用embeddedkafkabroker作为生产者和消费者: @Test(expected = ListenerExecutionFailedException.class) public void shouldThrowException() { RecordH

因此,我需要为我的kafkalistener方法创建一个集成测试,测试期望ListenerExecutionFailedException实际被抛出,因为消息在使用过程中由于另一个服务处于非活动状态而失败

下面是测试代码,我使用embeddedkafkabroker作为生产者和消费者:

@Test(expected = ListenerExecutionFailedException.class)
public void shouldThrowException() {

    RecordHeaders recordHeaders = new RecordHeaders();
    recordHeaders.add(new RecordHeader("messageType", "bootstrap".getBytes()));
    recordHeaders.add(new RecordHeader("userId", "123".getBytes()));
    recordHeaders.add(new RecordHeader("applicationId", "1234".getBytes()));
    recordHeaders.add(new RecordHeader("correlationId", UUID.randomUUID().toString().getBytes()));

    ProducerRecord<String, String> producerRecord = new ProducerRecord<>(
        "TEST_TOPIC",
        1,
        null,
        "message",
        "",
        recordHeaders);
    producer.send(producerRecord);


    consumer.subscribe(Collections.singleton("TEST_TOPIC"));

    consumer.poll(Duration.ofSeconds(2));

}
@Test(预期=ListenerExecutionFailedException.class)
public void shouldThrowException(){
RecordHeaders RecordHeaders=新的RecordHeaders();
添加(新的记录头(“messageType”,“bootstrap”.getBytes());
添加(新的记录头(“userId”,“123”.getBytes());
添加(新的记录头(“applicationId”,“1234”.getBytes());
添加(新记录头(“correlationId”,UUID.randomUUID().toString().getBytes());
PRODUCTERRECORD PRODUCTERRECORD=新PRODUCTERRECORD(
“测试主题”,
1.
无效的
“信息”,
"",
记录头);
生产商发送(生产商记录);
consumer.subscribe(Collections.singleton(“测试主题”);
消费者投票(持续时间为秒(2));
}
我想知道的是,异常被认为没有抛出,测试失败,即使我知道侦听器确实收到了消息,并且由于我在日志上看到了异常,所以抛出了异常

即使我将“预期”更改为“可丢弃”,也没有发现异常

我应该怎么做才能让Junit检测到异常


另外,另一件有趣的事情是,我试图模拟在侦听器中调用的服务类,并返回一些伪值,但在使用Mockito时没有调用该服务

producer.send

consumer.poll

您直接调用kafka客户机,在本测试中根本没有使用Spring


ListenerExecutionFailedException
是一个例外,Spring的侦听器容器包装了消息侦听器引发的用户异常。

您如何使用Spring发送和接收测试消息,以便调用应用程序中的@KafkaListener方法,并在抛出时捕获其异常?仅供参考,我已将预期异常更改为runtime和throwable,并使用KafkaTemplate发送消息侦听器在不同线程中运行。如果希望在单元测试中捕获异常,则必须直接从测试调用侦听器,而不是向kafka发送消息。如果您想创建一个集成测试,您可以包装您的侦听器-请参阅[此答案](侦听器在不同的线程中运行)以获取示例。