我正在编写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>
);
答案 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设置正确的模拟期望的更多详细信息。