OnFailure回调的Kafka Junit

OnFailure回调的Kafka Junit,junit,apache-kafka,mockito,spring-kafka,spring-kafka-test,Junit,Apache Kafka,Mockito,Spring Kafka,Spring Kafka Test,我有以下代码将数据发送到Kafka。我能够成功发送test OnSuces回调,但无法测试onFailure()方法 我得到下面的错误 java.lang.ClassCastException: org.mockito.codegen.Throwable$MockitoMock$2137573915不能强制转换为 org.springframework.kafka.core.KafkaProducerException @测试 void test()引发InterruptedException,

我有以下代码将数据发送到Kafka。我能够成功发送test OnSuces回调,但无法测试onFailure()方法

我得到下面的错误

java.lang.ClassCastException: org.mockito.codegen.Throwable$MockitoMock$2137573915不能强制转换为 org.springframework.kafka.core.KafkaProducerException

@测试
void test()引发InterruptedException,ExecutionException{
Throwable ex=mock(Throwable.class);
员工=新员工();
when(kafkaTemplate.send(null,employee)),然后return(responseFuture);
当(sendResult.getProducerRecord())。然后返回(producerRecord);
when(producerRecord.value())。然后return(employee);
doAnswer(调用锁定->{
ListenableFutureCallback ListenableFutureCallback=InvocationMock.getArgument(0);
listenableFutureCallback.onFailure(ex);
返回null;
}).when(responseFuture).addCallback(any(ListenableFutureCallback.class));
kafkaSender.sendMessage(员工);
}
@服务
公共级卡夫卡森德{
@自动连线
私人卡夫卡模板卡夫卡模板;
公共无效发送消息(员工){
ObjectMapper ObjectMapper=新的ObjectMapper();
ListenableFuture ListenableFuture=kafkaTemplate.send(主题,员工);
addCallback(新的ListenableFutureCallback(){
@凌驾
成功时公共无效(SendResult结果){
saveInDatabaseMethod(result.getProducerRecord());//要保存在数据库中的方法
}
@凌驾
失效时的公共无效(可丢弃的ex){
//类强制转换异常在此处发生
ProducerRecord ProducerRecord=((KafkaProducerException)ex).getFailedProducerRecord();
保存数据库方法(生产记录);
}
}
ProducerRecord ProducerRecord=((KafkaProducerException)ex).GetFailedProducerecord();
您的模拟不是使用KPE调用回调,而是使用

Throwable ex=mock(Throwable.class)


您需要将它包装在一个KPE中。

Russel实际上我已经通过
KafkaProducerException值=新的KafkaProducerException(producerRecord,“error”,ex);
解决了它,然后将它传递给
listenableFutureCallback.onFailure(value);
@Test
    void test() throws InterruptedException, ExecutionException {

         Throwable ex = mock(Throwable.class);
                 Employee employee = new Employee();

        when(kafkaTemplate.send(null,employee )).thenReturn(responseFuture);
            when(sendResult.getProducerRecord()).thenReturn(producerRecord);
            when(producerRecord.value()).thenReturn(employee);

            doAnswer(invocationOnMock -> {
                ListenableFutureCallback<SendResult<String, Employee>> listenableFutureCallback = invocationOnMock.getArgument(0);
                
                listenableFutureCallback.onFailure(ex);
               
                return null;
            }).when(responseFuture).addCallback(any(ListenableFutureCallback.class));
            
            kafkaSender.sendMessage(employee);
            
         }

@Service
public class KafkaSender{
    @Autowired
    private KafkaTemplate<String, Employee> kafkaTemplate;
    public void sendMessage(Employee employee) {

        ObjectMapper objectMapper = new ObjectMapper();

        ListenableFuture<SendResult<String, Employee>> listenableFuture = kafkaTemplate.send(topic,employee);

        listenableFuture.addCallback(new ListenableFutureCallback<SendResult<String, Employee>>() {

            @Override
            public void onSuccess(SendResult<String, Employee> result) {

                
                saveInDatabaseMethod(result.getProducerRecord()); // method to save in DB

            }

            @Override
            public void onFailure(Throwable ex) {

                                 // class cast exception occur here
                ProducerRecord<String, Employee> producerRecord = ((KafkaProducerException) ex).getFailedProducerRecord();


                saveInDatabaseMethod(producerRecord);

            }

            }