Camel 라우트 테스트가 어려운 이유
Camel 라우트는 외부 시스템(FTP 서버, 데이터베이스, 메시지 큐)과 연결되어 있어 단위 테스트가 까다롭습니다. 실제 서버 없이도 라우트 로직을 검증할 수 있어야 합니다. Camel은 이를 위해 강력한 테스트 지원 도구를 제공합니다.
camel-test 프레임워크 기본
JUnit과 통합된 camel-test를 사용하면 실제 CamelContext를 시작해 테스트할 수 있습니다.
public class OrderRouteTest extends CamelTestSupport {
@Override
protected RouteBuilder createRouteBuilder() {
return new OrderRoutes(); // 테스트할 라우트
}
@Test
public void testOrderProcessing() throws Exception {
MockEndpoint mockResult = getMockEndpoint("mock:result");
mockResult.expectedMessageCount(1);
mockResult.expectedBodyReceived().body(String.class).contains("처리완료");
template.sendBody("direct:orders", "주문번호:1234");
assertMockEndpointsSatisfied();
}
}
Mock 컴포넌트 – 실제 엔드포인트 대체
Mock 컴포넌트는 실제 FTP 서버나 데이터베이스 없이 메시지 수신 여부, 내용, 횟수를 검증할 수 있습니다.
@Test
public void testMultipleMessages() throws Exception {
MockEndpoint mock = getMockEndpoint("mock:output");
mock.expectedMessageCount(3);
mock.expectedBodiesReceived("A", "B", "C");
template.sendBody("direct:input", "A");
template.sendBody("direct:input", "B");
template.sendBody("direct:input", "C");
mock.assertIsSatisfied(5000); // 5초 이내 조건 충족 확인
}
adviceWith로 라우트 수정해 테스트
adviceWith는 기존 라우트를 수정하지 않고 테스트용으로 일부를 바꿀 수 있는 강력한 기능입니다. 실제 외부 시스템을 Mock으로 교체하는 데 주로 사용합니다.
@Test
public void testWithAdvice() throws Exception {
context.getRouteDefinition("my-route")
.adviceWith(context, new AdviceWithRouteBuilder() {
@Override
public void configure() throws Exception {
// FTP 엔드포인트를 mock으로 교체
interceptSendToEndpoint("ftp:*")
.skipSendToOriginalEndpoint()
.to("mock:ftp-upload");
}
});
MockEndpoint mock = getMockEndpoint("mock:ftp-upload");
mock.expectedMessageCount(1);
template.sendBody("direct:start", "테스트파일내용");
mock.assertIsSatisfied();
}
통합 테스트 전략
단위 테스트로 라우트 로직을 검증한 후, 통합 테스트에서는 실제 연동을 확인합니다. TestContainers를 사용하면 Docker로 실제 ActiveMQ, Kafka 등을 테스트 환경에서 실행할 수 있습니다.
@Container
static GenericContainer activemq =
new GenericContainer("rmohr/activemq:5.15.9")
.withExposedPorts(61616);
// 테스트 시 실제 ActiveMQ 컨테이너에 연결
String brokerUrl = "tcp://localhost:" + activemq.getMappedPort(61616);
이렇게 하면 CI/CD 환경에서도 외부 인프라 없이 완전한 통합 테스트를 실행할 수 있습니다.