首页 > 解决方案 > 错误:未完成的存根

问题描述

我正在编写 Junit 测试用例,我想模拟 KafkaTemplate 方法kafkaTemplate.send(TOPIC_NAME, "someData");。在我的项目中,我使用的是 Spring Boot 和 Kafka。

下面是StudentRecords课堂。我mockito用于模拟依赖项。

@Component
public class StudentRecords {
    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;

    @Value("${topicNameForStudents}")
    private String TOPIC_NAME;

    
    public String sendStudentData(StudentDTO studentDTO) {
        String studentStr = null;
        try {
            
            if(null == studentDTO) {
                throw new StudentException("studentDTO Object cant be null");
            }
            
            if(studentDTO.getId() == null) {
                throw new StudentException("Id cant be empty");
            }
            
            
            ObjectMapper mapper = new ObjectMapper();
            studentStr = mapper.writeValueAsString(srvgExecution);
            kafkaTemplate.send(TOPIC_NAME, studentStr);
            return "SUCCESS";
        } catch (JsonProcessingException e) {
            e.printStackTrace();
            return "ERROR";
        }
    }
}

测试类如下:

@ExtendWith({ SpringExtension.class, MockitoExtension.class })
class StudentRecordsTest {
    
    @InjectMocks
    StudentRecords studentRec;

    @Mock
    private KafkaTemplate<String, String> kafkaTemplate;
    
    
    @Test
    void testSendStudentData() {
    
        StudentDTO studentDTO = new StudentDTO();
        studentDTO.setId(1);
        studentDTO.setName("ABC");
        studentDTO.setAddress("Some Address");
        
        Mockito.when(kafkaTemplate.send(Mockito.anyString(), Mockito.anyString()));
        
        studentRec.sendStudentData(studentDTO);
        
    }

}

我收到以下错误

   [ERROR] Errors: 
   [ERROR]   studentRec.testSendStudentData: » UnfinishedStubbing

它正在线上发生studentRec.sendStudentData(studentDTO);

我如何为此解决/编写junit?


@Test
void testSendStudentData() {
    
    StudentDTO studentDTO = new StudentDTO();
    studentDTO.setId(1);
    studentDTO.setName("ABC");
    studentDTO.setAddress("Some Address");
        
    Mockito.when(kafkaTemplate.send(Mockito.anyString(), Mockito.anyString()));
        
    studentRec.sendStudentData(studentDTO);
    Mockito.verify(kafkaTemplate).send(Mockito.anyString(), Mockito.anyString());
        
}

将junit更新到以上一个后,在此语句中出现以下错误Mockito.verify(kafkaTemplate).send(Mockito.anyString(), Mockito.anyString());

Argument(s) are different! Wanted:
kafkaTemplate.send(
    <any string>,
    <any string>
);

标签: springspring-bootmockitojunit5spring-kafka-test

解决方案


您的模拟语句不完整。

Mockito.when(kafkaTemplate.send(Mockito.anyString(), Mockito.anyString()));

KafkaTemplate 的 send 方法返回一个 ListenableFuture 对象,因此您需要让您的模拟返回它。

我了解,您并没有真正将返回的值用作代码的一部分。

在这种情况下,您可以简单地返回 null ,如下所示。

Mockito.when(kafkaTemplate.send(Mockito.anyString(), Mockito.anyString())).thenReturn(null);

虽然,我建议您最好检查返回值以更好地处理错误,但这可能是完全不同的故事。

如果您确实计划通过检查返回值来处理错误,则可以编写上面的模拟语句来返回成功和失败的情况。

您可以查看以下线程以获取有关如何为 KafkaTemplate 设置正确的模拟期望的更多详细信息。

如何模拟来自 KafkaTemplate 的结果


推荐阅读