You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 13:15:24