SpringBoot中JUnit5测试Apache Camel ProducerTemplate Kafka发送接口
SpringBoot JUnit5测试用例:Mock Kafka Producer接口
测试依赖
确保项目依赖中包含以下组件(以Maven为例):
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-test-spring-junit5</artifactId> <scope>test</scope> </dependency>
控制器示例(基于常见实现)
假设你的MockKafkaProducerController代码如下:
@RestController @RequestMapping("/kafka") public class MockKafkaProducerController { private final ProducerTemplate producerTemplate; // 建议用构造注入,确保依赖能被正确Mock public MockKafkaProducerController(ProducerTemplate producerTemplate) { this.producerTemplate = producerTemplate; } @PostMapping("/send") public ResponseEntity<String> sendMessage(@RequestBody String message) { producerTemplate.send("kafka:topic:test-topic", message); return ResponseEntity.ok("Message sent successfully"); } }
测试用例实现
import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.verify; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import org.apache.camel.ProducerTemplate; @WebMvcTest(MockKafkaProducerController.class) public class MockKafkaProducerControllerTest { @Autowired private MockMvc mockMvc; // 用@MockBean替换Spring上下文里的ProducerTemplate为Mock实例 @MockBean private ProducerTemplate producerTemplate; @Test void sendMessage_ShouldReturnSuccessAndTriggerProducer() throws Exception { String testMsg = "Test Kafka Message"; String expectedResp = "Message sent successfully"; // 模拟调用POST接口 mockMvc.perform(post("/kafka/send") .contentType(MediaType.APPLICATION_JSON) .content(testMsg)) .andExpect(status().isOk()) .andExpect(content().string(expectedResp)); // 验证ProducerTemplate的send方法是否按预期参数被调用 verify(producerTemplate).send(eq("kafka:topic:test-topic"), eq(testMsg)); } }
关键注意事项
- @WebMvcTest:仅加载控制器相关的Spring上下文,避免启动整个应用,测试更轻量化。
- @MockBean:必须用这个注解创建Mock,手动实例的Mock无法被Spring注入到控制器中。
- 参数匹配验证:
verify时要确保参数和控制器中调用send的参数完全一致,包括主题名称、消息内容。 - 若之前Mock失败,检查控制器是否用构造注入(字段注入可能导致Mock无法生效)。
内容的提问来源于stack exchange,提问作者Saumya R Dash
相关产品推荐
相关产品推荐

