如何隔离运行带REST的Apache Camel路由并启动嵌入式Tomcat?
隔离测试Apache Camel REST路由并启动嵌入式Tomcat的方案
完全可以在不加载整个应用的隔离环境中实现你的需求,核心思路是精准控制Spring Boot上下文加载的范围,结合Camel的测试工具隔离目标路由,同时启动嵌入式Tomcat。以下是具体实现方式:
方法一:指定必要配置类缩小上下文范围
通过@SpringBootTest的classes属性,仅加载目标REST路由、Camel核心配置和Web服务器配置,避免加载所有50+个RouteBuilder。同时用@MockBean处理无关依赖,防止上下文启动失败。
示例测试代码
@SpringBootTest( classes = { YourRestRouteBuilder.class, // 你的目标REST路由类 CamelAutoConfiguration.class, // Camel核心自动配置 ServletWebServerFactoryAutoConfiguration.class // 嵌入式Web服务器自动配置 }, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT // 启动随机端口的嵌入式Tomcat ) @CamelSpringBootTest public class EmployeeRestRouteE2ETest { @Autowired private TestRestTemplate restTemplate; // Mock掉所有与测试无关的依赖Bean,避免上下文启动失败 @MockBean private UnrelatedServiceBean unrelatedService; @MockBean private AnotherUnrelatedComponent anotherUnrelatedComponent; @Test void testPostEmployeeEndpoint() { // 构造请求体 EmployeeRequest request = new EmployeeRequest(); request.setId("123"); request.setName("John Doe"); // 发送真实HTTP POST请求到目标端点 ResponseEntity<String> response = restTemplate.postForEntity( "/admin/k2/employee", request, String.class ); // 断言响应状态和内容 assertEquals(HttpStatus.OK, response.getStatusCode()); // 可根据实际业务添加更多断言 } }
方法二:自定义测试配置类
如果需要更精细的控制,可以编写专门的测试配置类,显式注册目标路由和必要组件,同时排除无关的自动配置。
自定义测试配置
@Configuration @EnableAutoConfiguration(exclude = { UnrelatedAutoConfig1.class, UnrelatedAutoConfig2.class // 排除不需要的自动配置类 }) public class RestRouteTestConfig { // 注册目标REST路由 @Bean public RouteBuilder employeeRestRoute() { return new YourRestRouteBuilder(); } // 若有必要,可在这里添加测试专用的Bean配置 }
测试类使用自定义配置
@SpringBootTest( classes = RestRouteTestConfig.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT ) @CamelSpringBootTest public class EmployeeRestRouteE2ETest { @Autowired private WebTestClient webTestClient; // 也可使用WebTestClient发送请求 @MockBean private UnrelatedDependency unrelatedDependency; @Test void testPostEmployee() { EmployeeRequest request = new EmployeeRequest(); // 设置请求参数... webTestClient.post() .uri("/admin/k2/employee") .bodyValue(request) .exchange() .expectStatus().isOk() .expectBody(String.class).isEqualTo("Success"); } }
可选:隔离下游路由(进一步解耦)
如果你的REST路由会转发到其他路由(比如示例中的SEDA端点),但你只想测试REST端点本身,可通过AdviceWith修改路由,将下游端点替换为Mock,无需加载依赖的RouteBuilder:
@Test void testRestEndpointWithoutDownstreamRoute() throws Exception { // 修改目标路由,替换SEDA端点为Mock context.getRouteDefinition(YourRestRouteBuilder.ROUTE_BUILDER_ID) .adviceWith(context, new AdviceWithRouteBuilder() { @Override public void configure() throws Exception { weaveByToUri("seda:" + K2EmployeesRouteBuilder.ROUTE_BUILDER_ID) .replace() .to("mock:employeeQueue"); } }); // 发送请求... // 验证Mock端点是否收到消息 MockEndpoint mockQueue = context.getEndpoint("mock:employeeQueue", MockEndpoint.class); mockQueue.expectedMessageCount(1); mockQueue.assertIsSatisfied(); }
内容的提问来源于stack exchange,提问作者JirMed
相关产品推荐
相关产品推荐

