1.4. Camel Quarkus Extensions 테스트


테스트에서는 시간이 지남에 따라 Camel 경로가 예상대로 작동하도록 하는 좋은 방법입니다. 아직 Camel Quarkus 사용자 가이드 First Steps 및 Quarkus 설명서 링크:애플리케이션 테스트 섹션을 참조하십시오.

Quarkus에서 경로를 테스트하는 가장 쉬운 방법은 로컬 통합 테스트를 작성하는 것입니다. JVM 및 기본 모드를 모두 다루는 이점이 있습니다.

JVM 모드에서는 테스트의CamelTestSupport 스타일을 사용할 수 있습니다.

1.4.1. JVM 모드에서 실행

JVM 모드에서 @QuarkusTest 주석을 사용하여 Quarkus를 부트스트랩하고 @Test 논리가 실행되기 전에 Camel 경로를 시작합니다.

예를 들면 다음과 같습니다.

import io.quarkus.test.junit.QuarkusTest;
import org.junit.jupiter.api.Test;

@QuarkusTest
class MyTest {
    @Test
    public void test() {
        // Use any suitable code that sends test data to the route and then assert outcomes
        ...
    }
}
Copy to Clipboard Toggle word wrap
작은 정보

Camel Quarkus 소스에서 샘플 구현을 찾을 수 있습니다.

1.4.2. 기본 모드에서 실행

참고

항상 지원되는 모든 확장에 대해 애플리케이션이 기본 모드에서 작동하는지 테스트합니다.

각 JVM 모드 클래스에서 논리를 상속하여 JVM 모드에 대해 정의된 테스트 논리를 재사용할 수 있습니다.

@Quarkus>-<Test 주석을 추가하여 테스트 중인 애플리케이션을 네이티브 이미지로 컴파일하고 테스트를 실행하기 전에 Quarkus JUnit 확장에 알립니다.

import io.quarkus.test.junit.QuarkusIntegrationTest;

@QuarkusIntegrationTest
class MyIT extends MyTest {
   ...
}
Copy to Clipboard Toggle word wrap
작은 정보

Camel Quarkus 소스에서 샘플 구현을 찾을 수 있습니다.

1.4.3. @QuarkusTest 및 @Quarkus 툴과의차이점

네이티브 실행 파일은 실행할 JVM이 필요하지 않으며 바이트 코드가 아닌 네이티브 코드이므로 JVM에서 실행할 수 없습니다.

기존 JVM을 사용하여 실행할 수 있도록 네이티브 코드에 대한 컴파일 테스트는 없습니다.

즉, 테스트와 애플리케이션 간의 통신은 파일 시스템(예: 로그 파일) 또는 기타 프로세스 간 통신을 통해 네트워크(HTTP/REST 또는 애플리케이션에서 사용하는 기타 프로토콜)를 통과해야 합니다.

1.4.3.1. JVM 모드에서 @QuarkusTest

JVM 모드에서 테스트 중인 애플리케이션과 동일한 JVM에서 @QuarkusTest 로 주석이 달린 테스트는 실행합니다.

즉, @Inject 를 사용하여 애플리케이션의 빈을 테스트 코드에 추가할 수 있습니다.

또한 새 빈을 정의하거나 @javax.enterprise.inject.Alternative@javax.annotation.Priority 를 사용하여 애플리케이션에서 빈을 재정의할 수도 있습니다.

기본 모드에서 테스트는 실행 중인 네이티브 애플리케이션과 별도로 호스팅되는 JVM에서 @Quarkus>-<Test 가 실행됩니다.

Quarkus ScanSettingTest@QuarkusTest 를 통해 사용할 수 없는 추가 기능을 제공합니다.

  • JVM 모드에서는 Quarkus 빌드에서 생성한 실행 가능 애플리케이션 JAR을 시작하고 테스트할 수 있습니다.
  • 기본 모드에서는 Quarkus 빌드에서 생성한 네이티브 애플리케이션을 시작하고 테스트할 수 있습니다.
  • 빌드에 컨테이너 이미지를 추가하면 컨테이너가 시작되고 이에 대해 테스트가 실행됩니다.

Quarkus>-<Test 에 대한 자세한 내용은 Quarkus 테스트 가이드를 참조하십시오.

1.4.4. 외부 서비스로 테스트

1.4.4.1. Testcontainers

경우에 따라 애플리케이션에서 메시징 브로커, 데이터베이스 또는 기타 서비스와 같은 일부 외부 리소스에 액세스해야 합니다.

관심 있는 서비스에 컨테이너 이미지를 사용할 수 있는 경우 Testcontainers 를 사용하여 테스트 중에 서비스를 시작하고 구성할 수 있습니다.

1.4.4.1.1. QuarkusTestResourceLifecycleManager로 구성 데이터 전달

애플리케이션이 제대로 작동하려면 시작하기 전에 연결 구성 데이터(호스트, 포트, 사용자, 원격 서비스의 암호)를 애플리케이션에 전달해야 하는 경우가 많습니다.

Quarkus 에코시스템에서 QuarkusTestResourceLifecycleManager 는 이러한 용도로 사용됩니다.

start() 메서드에서 하나 이상의 Testcontainers를 시작하고 Map 형식의 메서드에서 연결 구성을 반환할 수 있습니다.

그러면 이 맵의 항목이 모드에 따라 다양한 방식으로 애플리케이션에 전달됩니다.

  • 네이티브 모드: 명령줄 (-Dkey=value)
  • JVM 모드: 특수 MicroProfile 구성 공급자
참고

이러한 설정은 application.properties 파일의 설정보다 우선 순위가 높습니다.

import java.util.Map;
import java.util.HashMap;

import io.quarkus.test.common.QuarkusTestResourceLifecycleManager;
import org.testcontainers.containers.GenericContainer;
import org.testcontainers.containers.wait.strategy.Wait;

public class MyTestResource implements QuarkusTestResourceLifecycleManager {

    private GenericContainer myContainer;

    @Override
    public Map<String, String> start() {
        // Start the needed container(s)
        myContainer = new GenericContainer(...)
                .withExposedPorts(1234)
                .waitingFor(Wait.forListeningPort());

        myContainer.start();

        // Pass the configuration to the application under test
        return new HashMap<>() {{
                put("my-container.host", container.getContainerIpAddress());
                put("my-container.port", "" + container.getMappedPort(1234));
        }};
    }

    @Override
    public void stop() {
        // Stop the needed container(s)
        myContainer.stop();
        ...
    }
Copy to Clipboard Toggle word wrap

@QuarkusTestResource 를 사용하여 테스트 클래스에서 정의된 테스트 리소스를 참조합니다.

import io.quarkus.test.common.QuarkusTestResource;
import io.quarkus.test.junit.QuarkusTest;

@QuarkusTest
@QuarkusTestResource(MyTestResource.class)
class MyTest {
   ...
}
Copy to Clipboard Toggle word wrap
작은 정보

Camel Quarkus 소스에서 샘플 구현을 찾을 수 있습니다.

1.4.4.2. WireMock

예를 들어, 테스트에서 라이브 엔드포인트에 연결하는 대신 사용할 수 없거나 신뢰할 수 없거나 비용이 많이 드는 경우 타사 서비스 및 API와 HTTP 상호 작용을 스텁할 수 있습니다.

Mocking & recording HTTP 상호 작용에 WireMock 을 사용할 수 있습니다. 다양한 구성 요소 확장을 위해 Camel Quarkus 테스트 모음 전체에 광범위하게 사용됩니다.

1.4.4.2.1. WireMock 설정

절차

  1. WireMock 서버를 설정합니다.

    참고

    WireMock 프록시를 통해 HTTP 상호 작용을 전달하도록 Camel 구성 요소를 테스트에서 구성하는 것이 중요합니다. API 끝점 URL을 결정하는 구성 요소 속성을 구성하여 이를 수행할 수 있습니다.

    import static com.github.tomakehurst.wiremock.client.WireMock.aResponse;
    import static com.github.tomakehurst.wiremock.client.WireMock.get;
    import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo;
    import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig;
    
    import java.util.HashMap;
    import java.util.Map;
    
    import com.github.tomakehurst.wiremock.WireMockServer;
    
    import io.quarkus.test.common.QuarkusTestResourceLifecycleManager;
    
    public class WireMockTestResource implements QuarkusTestResourceLifecycleManager {
    
        private WireMockServer server;
    
        @Override
        public Map<String, String> start() {
            // Setup & start the server
            server = new WireMockServer(
                wireMockConfig().dynamicPort()
            );
            server.start();
    
            // Stub a HTTP endpoint. Note that WireMock also supports a record and playback mode
            // http://wiremock.org/docs/record-playback/
            server.stubFor(
                get(urlEqualTo("/api/greeting"))
                    .willReturn(aResponse()
                        .withHeader("Content-Type", "application/json")
                        .withBody("{\"message\": \"Hello World\"}")));
    
            // Ensure the camel component API client passes requests through the WireMock proxy
            Map<String, String> conf = new HashMap<>();
            conf.put("camel.component.foo.server-url", server.baseUrl());
            return conf;
        }
    
        @Override
        public void stop() {
            if (server != null) {
                server.stop();
            }
        }
    }
    Copy to Clipboard Toggle word wrap
    참고

    경우에 따라 덜 간단하며 API 클라이언트 라이브러리를 구성하려면 추가 작업이 필요합니다. 예를 들어 Twilio 의 경우.

  2. 테스트 클래스에 값으로 지정된 적절한 테스트 리소스 클래스를 사용하여 @QuarkusTestResource 주석이 있는지 확인합니다.
import io.quarkus.test.common.QuarkusTestResource;
import io.quarkus.test.junit.QuarkusTest;

@QuarkusTest
@QuarkusTestResource(WireMockTestResource.class)
class MyTest {
   ...
}
Copy to Clipboard Toggle word wrap

WireMock 서버는 모든 테스트가 실행되기 전에 시작되고 모든 테스트가 완료되면 종료됩니다.

작은 정보

Camel Quarkus 통합 소스 트리에서 샘플 구현을 확인할 수 있습니다.

1.4.5. CamelQuarkusTestSupport사용

Camel Quarkus 2.13.0 이후 CamelQuarkusTestSupport 를 테스트에 사용할 수 있습니다. CamelTestSupport 를 대체합니다.

참고

이 작업은 JVM 모드에서만 작동합니다.

1.4.5.1. JVM 모드에서 CamelQuarkusTestSupport 로 테스트

모듈에 다음 종속성을 추가합니다(예: 테스트 범위).

<dependency>
    <groupId>org.apache.camel.quarkus</groupId>
    <artifactId>camel-quarkus-junit5</artifactId>
    <scope>test</scope>
</dependency>
Copy to Clipboard Toggle word wrap

다음과 같이 테스트에서 CamelQuarkusTestSupport 를 사용할 수 있습니다.

@QuarkusTest
@TestProfile(SimpleTest.class) //necessary only if "newly created" context is required for the test (worse performance)
public class SimpleTest extends CamelQuarkusTestSupport {
    ...
}
Copy to Clipboard Toggle word wrap

1.4.5.2. CamelQuarkusTestSupport사용 시 제한 사항

'CamelQuarkusTestSupport를 사용할 때 다음과 같은 몇 가지 제한 사항이 있습니다.

1.4.5.2.1. 방법

일부 방법은 실행되지 않습니다. 대신 대신 새 방법으로 시작하는 방법을 사용합니다.

Expand
실행되지 않음대신 사용

afterAll

doAfterAll

afterEach

doAfterEach

afterTestExecution

doAfterTestExecution

beforeAll

doBeforeAll

beforeEach

doBeforeEach

참고

@TestInstance(TestInstance.Lifecycle.PER_METHOD) 를 사용하는 경우, doAfter 3-4은 각 테스트 전에 콜백을 의미합니다. 이는 이전 모두와 다릅니다.

1.4.5.2.2. 주석

테스트 클래스에 @io.quarkus.test.junit.QuarkusTest 를 추가하고 org.apache.camel.camel.quarkus.test.CamelQuarkusTestSupport 를 확장해야 합니다.

1.4.5.2.3. 시작 및 중지
  • 단일 애플리케이션의 라이프사이클 내에서 동일한 CamelContext 인스턴스를 중지하고 다시 시작할 수 없습니다. CamelContext.stop() 을 호출할 수 있지만 CamelContext.start() 는 작동하지 않습니다.
  • CamelContext 는 일반적으로 테스트 시에도 애플리케이션을 시작하고 중지해야 합니다.
  • 테스트 중인 애플리케이션은 지정된 Maven/Gradle 모듈의 모든 테스트 클래스에 대해 한 번 시작됩니다. Quarkus JUnit Extension은 애플리케이션의 시작 및 중지를 제어합니다. 중지하도록 애플리케이션에 명시적으로 지시해야 합니다.
1.4.5.2.4. 애플리케이션을 다시 시작

Quarkus JUnit Extension이 지정된 테스트 클래스에 대해 애플리케이션 및 CamelContext 를 강제로 다시 시작하려면 고유한 @io.quarkus.test.junit.TestProfile 을 해당 클래스에 할당해야 합니다.

자세한 내용은 Quarkus 설명서의 다양한 프로필 테스트를 참조하십시오.

유사한 효과의 경우 @io.quarkus.test.common.QuarkusTestResource 를 사용할 수도 있습니다.

1.4.5.2.5. 빈 프로덕션

Camel Quarkus는 빌드 단계에서 빈 프로덕션을 실행합니다. 테스트는 함께 빌드되므로 제외 동작이 CamelQuarkusTestSupport 에 구현됩니다. 특정 유형 및 이름의 생산자가 하나의 테스트에서 사용되는 경우 나머지 테스트에 대해 인스턴스가 동일합니다.

1.4.5.2.6. JUnit Jopiter 콜백이 작동하지 않을 수 있습니다.

이러한 JUnit Jopiter 콜백 및 주석은 작동하지 않을 수 있습니다.

Expand
콜백주석

BeforeEachCallback

@BeforeEach

AfterEachCallback

@AfterEach

AfterAllCallback

@AfterAll

BeforeAllCallback

@BeforeAll

BeforeTestExecutionCallback

 

AfterTestExecutionCallback

 

자세한 내용은 QuarkusTest*>-<back 설명서에서 Enrichment를 참조하십시오.

1.4.5.2.7. adviceWith 사용

adviceWith 가 true로 설정되면 모든 수정되지 않은 경로가 시작되지 않습니다. 해당 경로를 시작하려면 CamelQuarkusTestSupport.startRouteDefinitions() 메서드를 실행해야 합니다.

1.4.5.2.8. @Produces사용

재정의된 메서드 createRouteBuilder() 와 함께 @Produces 를 사용합니다. @ProducesRouteBuilder() 의 조합이 제대로 작동하지 않을 수 있습니다.

1.4.5.2.9. 경로 구성

애플리케이션을 포함하거나 제외하도록 애플리케이션(ECDHE/main/java)의 경로를 구성하려면 다음을 사용할 수 있습니다.

  • quarkus.camel.routes-discovery.exclude-patterns
  • quarkus.camel.routes-discovery.include-patterns

자세한 내용은 Core 설명서 를 참조하십시오.

맨 위로 이동
Red Hat logoGithubredditYoutubeTwitter

자세한 정보

평가판, 구매 및 판매

커뮤니티

Red Hat 문서 정보

Red Hat을 사용하는 고객은 신뢰할 수 있는 콘텐츠가 포함된 제품과 서비스를 통해 혁신하고 목표를 달성할 수 있습니다. 최신 업데이트를 확인하세요.

보다 포괄적 수용을 위한 오픈 소스 용어 교체

Red Hat은 코드, 문서, 웹 속성에서 문제가 있는 언어를 교체하기 위해 최선을 다하고 있습니다. 자세한 내용은 다음을 참조하세요.Red Hat 블로그.

Red Hat 소개

Red Hat은 기업이 핵심 데이터 센터에서 네트워크 에지에 이르기까지 플랫폼과 환경 전반에서 더 쉽게 작업할 수 있도록 강화된 솔루션을 제공합니다.

Theme

© 2025 Red Hat