如何为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
相关产品推荐
相关产品推荐

