spring - 错误:未完成的存根
问题描述
我正在编写 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>
);
解决方案
您的模拟语句不完整。
Mockito.when(kafkaTemplate.send(Mockito.anyString(), Mockito.anyString()));
KafkaTemplate 的 send 方法返回一个 ListenableFuture 对象,因此您需要让您的模拟返回它。
我了解,您并没有真正将返回的值用作代码的一部分。
在这种情况下,您可以简单地返回 null ,如下所示。
Mockito.when(kafkaTemplate.send(Mockito.anyString(), Mockito.anyString())).thenReturn(null);
虽然,我建议您最好检查返回值以更好地处理错误,但这可能是完全不同的故事。
如果您确实计划通过检查返回值来处理错误,则可以编写上面的模拟语句来返回成功和失败的情况。
您可以查看以下线程以获取有关如何为 KafkaTemplate 设置正确的模拟期望的更多详细信息。
推荐阅读
- java - 有没有办法找到安装在 OS X 上的 Java 版本的完整列表?
- java - 我应该在这个程序中传递什么参数以避免 java.lang 错误?
- r - 将另一列添加到数据框中,通过一个标签定义多个值的标签以绘制分组条形图
- python - 尽管成功登录,但用户身份验证失败
- html - CSS悬停在邻居上以切换属性
- python - scipy.optimize.curve_fit,参数全部返回 1
- java - 使用带有 Java 的 Tesseract 从图像中提取文本时出错
- oracle - 有什么方法可以在字典表中找到所有内置的 oracle 函数?
- javascript - 将 easylist 与 chrome declarativeNetRequest 一起使用
- python - 我发起了一个回调,但它没有按定义工作