1. 개요

Apache Camel 은 여러 알려진 엔터프라이즈 통합 패턴 을 구현하는 강력한 오픈 소스 통합 프레임워크 입니다.

이 예제에서는 Camel 경로에 대한 신뢰할 수 있고 독립적인 단위 테스트를 작성하는 방법을 배웁니다 .

먼저 Spring Boot 를 사용하여 기본 Camel 애플리케이션을 생성하는 것으로 시작하겠습니다 . 그런 다음 Camel의 Spring 테스트 지원 API를 JUnit 5 와 함께 사용하여 애플리케이션을 테스트 하는 방법을 살펴보겠습니다 .

2. 의존성

프로젝트 설정 이 있고 Spring Boot 및 Camel과 함께 작동하도록 구성되어 있다고 가정 합니다.

그런 다음 pom.xml 에 camel-test-spring-junit5 의존성을 추가해야 합니다 .

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-test-spring-junit5</artifactId>
    <version>3.15.0</version>
    <scope>test</scope>
</dependency>

이름에서 알 수 있듯이 이 의존성은 특히 단위 테스트를 위한 것입니다.

3. 간단한 Camel Spring Boot 애플리케이션 정의

이 사용방법(예제) 전체에서 테스트의 초점은 간단한 Apache Camel Spring Boot 애플리케이션입니다.

이제 애플리케이션 진입점을 정의하여 시작하겠습니다.

@SpringBootApplication
public class GreetingsFileSpringApplication {

    public static void main(String[] args) {
        SpringApplication.run(GreetingsFileSpringApplication.class, args);
    }
}

보시다시피 이것은 표준 Spring Boot 애플리케이션입니다.

3.1. 경로 생성

다음으로 상당히 기본적인 경로를 정의합니다.

@Component
public class GreetingsFileRouter extends RouteBuilder {

    @Override
    public void configure() throws Exception {
        
        from("direct:start")
          .routeId("greetings-route")
          .setBody(constant("Hello Baeldung Readers!"))
          .to("file:output");
    }
}

빠르게 요약하자면, Apache Camel의 경로는 일반적으로 메시지를 소비하고 처리하는 Camel이 순서대로 실행하는 일련의 단계로 구성된 기본 빌딩 블록입니다.

간단한 예에서 볼 수 있듯이 start 라는 직접 Endpoints 에서 메시지를 사용하도록 경로를 구성합니다 .

그런 다음 Hello Baeldung Readers 라는 문자열을 포함하도록 메시지 본문을 설정합니다 . 파일 구성 요소 를 사용하여 메시지 교환 내용을 output 이라는 파일 디렉토리 에 씁니다 .

우리는 또한 우리 경로에 greetings-route 라는 id를 부여 합니다 . 경로에 ID를 사용하는 것은 일반적으로 좋은 습관으로 간주되며 경로를 테스트할 때 도움이 될 수 있습니다.

3.2. 애플리케이션 실행

이 섹션을 마치려면 애플리케이션을 실행하고 직접적인 소비자 Endpoints에 메시지를 보내면 출력 디렉터리의 파일 안에 인사말 텍스트가 표시되어야 합니다. 파일 이름을 지정하지 않으면 Camel이 파일 이름을 생성합니다.

$ cat output/D97099B6B2958D2-0000000000000000 
Hello Baeldung Readers!

4. 테스트에 대한 말씀

일반적으로 클린 테스트를 작성할 때 제어할 수 없거나 갑자기 작동을 멈출 수 있는 외부 서비스나 파일 시스템에 의존해서는 안 됩니다. 이는 테스트 결과에 악영향을 미칠 수 있습니다.

또한 우리는 특별히 단위 테스트를 위해 경로에 코드를 작성하고 싶지 않습니다. 고맙게도 Camel에는 테스트용으로 특별히 확장 및 API 세트가 있습니다 . 그래서 우리는 이것을 일종의 테스트 키트라고 생각할 수 있습니다.

이 키트를 사용하면 경로에 메시지를 보내고 메시지가 예상대로 수신되는지 확인하여 Camel 애플리케이션을 더 쉽게 테스트할 수 있습니다.

5. @MockEndpoints 를 사용한 테스트

마지막 섹션을 염두에 두고 첫 번째 단위 테스트를 작성해 보겠습니다.

@SpringBootTest
@CamelSpringBootTest
@MockEndpoints("file:output")
class GreetingsFileRouterUnitTest {

    @Autowired
    private ProducerTemplate template;

    @EndpointInject("mock:file:output")
    private MockEndpoint mock;

    @Test
    void whenSendBody_thenGreetingReceivedSuccessfully() throws InterruptedException {
        mock.expectedBodiesReceived("Hello Baeldung Readers!");
        template.sendBody("direct:start", null);
        mock.assertIsSatisfied();
    }
}

테스트의 핵심 부분을 살펴보겠습니다.

먼저 세 가지 어노테이션으로 테스트 클래스를 장식하는 것으로 시작합니다.

  • @SpringBootTest 어노테이션은 테스트가 Spring 애플리케이션 컨텍스트를 부트스트랩하도록 합니다 .
  • 우리는 또한 @CamelSpringBootRunner 를 사용하여 Boot 기반 테스트에 Spring 기반 Camel 테스트 지원을 제공합니다.
  • 마지막으로 @MockEndpoints 어노테이션을 추가하여 Camel에게 모의 객체를 만들고자 하는 엔드포인트를 알려줍니다.

다음으로 메시지 교환을 Endpoints으로 보낼 수 있는 인터페이스인 ProducerTemplate 개체를 자동 연결합니다.

또 다른 핵심 구성 요소는 @EndpointInject 를 사용하여 주입하는 MockEndpoint 입니다 . 이 어노테이션을 사용하면 경로가 시작될 때 Camel에게 알려주고 모의 Endpoints을 삽입하려고 합니다.

이제 모든 테스트 설정이 완료되었으므로 세 단계로 구성된 테스트를 작성할 수 있습니다.

  • 먼저 모의 Endpoints이 주어진 메시지 본문을 수신할 것이라는 기대치를 설정합니다.
  • 그런 다음 템플릿을 사용하여 direct:start 엔드포인트 에 메시지를 보냅니다 . 경로가 수신 메시지 본문을 조작하지 않으므로 null 본문을 보냅니다.
  • 테스트를 마무리 하기 위해 assertIsSatisfied 메서드를 사용하여 모의 엔드포인트에 대한 초기 기대치가 충족되었는지 확인합니다.

이것은 테스트가 올바르게 작동하고 있음을 확인합니다. 엄청난! 이제 우리는 Camel 테스트 지원 유틸리티를 사용하여 자체 포함된 독립 단위 테스트를 작성할 수 있습니다.

6. 결론

이 기사에서는 Spring Boot에서 Apache Camel 경로를 테스트하는 방법을 배웠습니다. 먼저 Spring Boot를 사용하여 하나의 경로로 간단한 Camel 애플리케이션을 만드는 방법을 배웠습니다.

그런 다음 Apache Camel의 기본 제공 테스트 지원 프로젝트에서 사용할 수 있는 일부 기능을 사용하여 경로를 테스트하기 위한 권장 접근 방식에 대해 배웠습니다.

언제나처럼 기사의 전체 소스 코드는  GitHub에서 확인할 수 있습니다 .

Junit footer banner