错误:未完成的存根

时间:2020-07-25 17:50:11

标签: spring spring-boot mockito junit5 spring-kafka-test

我正在编写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更新为1之后,在此语句Mockito.verify(kafkaTemplate).send(Mockito.anyString(), Mockito.anyString());处以以下错误结束

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

1 个答案:

答案 0 :(得分:0)

您的模拟语句不完整。

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

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

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

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

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

尽管如此,我建议您最好检查返回值以更好地处理错误,但这可能完全是另一回事。

如果您打算通过检查返回值来处理错误,则可以编写上面的模拟语句以返回成功和失败案例。

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

How to mock result from KafkaTemplate