[Camel in Action] 9-1. Camel 라우트 테스트 전략 – camel-test와 Mock 컴포넌트

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 환경에서도 외부 인프라 없이 완전한 통합 테스트를 실행할 수 있습니다.

Leave a Comment