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

如何隔离运行带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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 05:54:58