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

如何为Camel Spring Route编写JUnit5测试?Mock未调用问题求助

问题诊断与解决方案

核心问题:Mock实例未被Camel路由正确使用

测试失败的原因是authorizationService的Mock实例没有被注入到Camel路由中,路由执行时调用的是真实实例或未被Mock的实例,导致verify断言触发「Wanted but not invoked」错误。

具体修复步骤

1. 为依赖类添加@MockBean注解

在测试类中,必须用@MockBean将真实的服务类替换为Mock实例,确保Camel路由能使用这些Mock:

@CamelSpringBootTest
@SpringBootTest
@ActiveProfiles("it")
@AutoConfigureEmbeddedDatabase(provider = AutoConfigureEmbeddedDatabase.DatabaseProvider.DOCKER)
@UseAdviceWith
class ServiceNowRoutePermissionTest {

    // 用MockBean替换真实的权限服务
    @MockBean
    private AuthorizationService authorizationService;

    // 同样替换API服务,保证buildEndpointUrl的Mock生效
    @MockBean
    private ApiService apiService;

    @BeforeEach
    void setup() throws Exception {
        when(apiService.buildEndpointUrl(anyString())).thenReturn("mock:endpoint");
        adviceRoute("handlePostApiReq");
        camelContext.start();
    }

    // 其余代码保持不变...
}

2. 确保路由中的依赖是Spring注入的

检查你的Camel路由类,所有依赖服务必须通过Spring依赖注入(构造注入优先),不能直接new实例:

@Component
public class YourRouteBuilder extends RouteBuilder {

    private final AuthorizationService authorizationService;
    private final IntegrationUtil integrationUtil;
    private final ApiService apiService;

    // 构造注入(推荐方式)
    public YourRouteBuilder(AuthorizationService authorizationService,
                            IntegrationUtil integrationUtil,
                            ApiService apiService) {
        this.authorizationService = authorizationService;
        this.integrationUtil = integrationUtil;
        this.apiService = apiService;
    }

    @Override
    public void configure() throws Exception {
        from("direct:postApiReq")
            .routeId("handlePostApiReq")
            .process(exchange -> {
                authorizationService.checkPermission(); // 使用注入的Mock实例
            })
            .setHeader(Constants.REQUEST_MODEL).constant(LinkedHashMap.class)
            .process(exchange -> {
                integrationUtil.buildHeaders(exchange, HttpMethod.POST);
                exchange.setProperty("endpoint", apiService.buildEndpointUrl(orgId));
            })
            .setBody(simple("${body}"))
            .toD("${exchangeProperty.endpoint}");
    }
}

3. 优化AdviceWith逻辑(可选)

如果你的测试目标只是验证权限检查,不需要在路由末尾额外添加Mock端点,可以修改AdviceWith来替换原有的第三方API调用:

private void adviceRoute(String routeId) throws Exception {
    AdviceWith.adviceWith(camelContext, routeId, advice -> {
        // 替换所有外部端点调用为Mock,避免触发真实API请求
        advice.weaveByToUri("*").replace().to("mock:endpoint");
    });
    MockEndpoint mockEndpoint = camelContext.getEndpoint("mock:endpoint", MockEndpoint.class);
    mockEndpoint.whenAnyExchangeReceived(exchange ->
        exchange.getIn().setBody("{\"result\": \"success\"}"));
}

4. 验证测试执行逻辑

运行测试时确认:

  • Camel上下文正常启动,目标路由被加载
  • 发送到direct:postApiReq的Exchange能完整执行到权限检查步骤
  • Mock的authorizationService.checkPermission()被正确调用

内容的提问来源于stack exchange,提问作者sreekesh.s

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 05:19:57