Looking for apache-camel Answers? Try Ask4KnowledgeBase
Looking for apache-camel Keywords? Try Ask4Keywords

apache-camel Beispiel für Testklassen der Camel Integration


Beispiel

Vergessen Sie nicht, die Kameltestunterstützung und die Federkameltestunterstützung zu Ihren Projektabhängigkeiten hinzuzufügen. Für Maven-Benutzer sehen Sie Folgendes:

<dependency>
  <groupId>org.apache.camel</groupId>
  <artifactId>camel-test</artifactId>
  <version>${camel.version}</version>
  <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-test-spring</artifactId>
    <version>${camel.version}</version>
     <scope>test</scope>
</dependency>

Diese Klasse wird Tests auf der Beispielroute auslösen und ausführen. Diese Tests verwenden DBUnit auch zum Simulieren einer Datenbank. Sie können Ihren Kontext jedoch so konfigurieren, dass er eine echte oder eine andere Art von Datenbank verwendet.

Zunächst verwenden wir eine abstrakte Klasse, um gemeinsame Anmerkungen zwischen den einzelnen Camel Integration Test-Klassen zu teilen, die wir später verwenden werden:

@RunWith(CamelSpringRunner.class)
@BootstrapWith(CamelTestContextBootstrapper.class)
@ContextConfiguration(locations = { "classpath:/test-beans.xml" })
@DbUnitConfiguration(dataSetLoader = ReplacementDataSetLoader.class)
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, DirtiesContextTestExecutionListener.class,
        DbUnitTestExecutionListener.class })
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
public abstract class AbstractCamelTI {

}

Achten Sie darauf , keine Anmerkungen zu vergessen, da sonst Ihre DAOs nicht korrekt injiziert werden. Sie können jedoch die DBUnit-Anmerkungen sicher entfernen, wenn Sie die in Ihrer Kontextkonfiguration abgebildete Datenbank nicht verwenden möchten.

WICHTIG EDIT: Ich habe den zusätzlichen @DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD) vor kurzem. Auf diese Weise wird das Kamel Kontext für jeden Test neu geladen. Sie können jeden Teil Ihrer Route individuell testen. Wenn Sie das wirklich wollen, müssen Sie remove () für die Teile der ausgewählten Route verwenden, die Sie nicht durchlaufen möchten. Einige würden argumentieren, dass dies kein echter Integrationstest ist, und sie hätten recht. Wenn Sie jedoch, wie ich, große Prozessoren haben, die Sie umgestalten müssen, können Sie dort anfangen.

Der folgende Code zeigt den Beginn der Testklasse (siehe unten für die eigentlichen Tests):

@DatabaseSetup(value = { "/db_data/dao/common.xml", "/db_data/dao/importDocumentDAOCommonTest.xml" })
public class TestExampleProcessorTest extends AbstractCamelTI {

    @Autowired
    protected CamelContext camelContext;

    @EndpointInject(uri = "mock:catchTestEndpoint")
    protected MockEndpoint mockEndpoint;

    @Produce(uri = TestExampleRoute.ENDPOINT_EXAMPLE)
    protected ProducerTemplate template;

    @Autowired
    ImportDocumentTraitementDAO importDocumentTraitementDAO;

    // -- Variables for tests
    ImportDocumentProcess importDocumentProcess;

    @Override
    @Before
    public void setUp() throws Exception {
        super.setUp();

        importDocumentProcess = new ImportDocumentProcess();
        //specific implementation of your choice
    }
}

Der folgende Test soll den ersten Teil der Route auslösen und zu einem mockEndpoint damit wir testen können, ob der ImportDocumentProcess richtig ausgewählt und in die Kopfzeilen eingefügt wurde:

@Test
public void processCorrectlyObtained_getImportDocumentProcess() throws Exception {
    camelContext.getRouteDefinitions().get(0).adviceWith(camelContext, new AdviceWithRouteBuilder() {

        @Override
        public void configure() throws Exception {
            weaveById("getImportDocumentProcess").after().to(mockEndpoint);
        }
    });

    // -- Launching the route
    camelContext.start();
    template.sendBodyAndHeader(null, "entreprise", company);

    mockEndpoint.expectedMessageCount(1);
    mockEndpoint.expectedHeaderReceived(TestExampleProcessor.HEADER_UTILISATEUR, null);
    mockEndpoint.expectedHeaderReceived(TestExampleProcessor.HEADER_IMPORTDOCPROCESS, importDocumentProcess);
    mockEndpoint.assertIsSatisfied();

    camelContext.stop();
}

Der letzte Test löst die gesamte Route aus:

@Test
public void traitementCorrectlyCreated_createImportDocumentTraitement() throws Exception {
    camelContext.getRouteDefinitions().get(0).adviceWith(camelContext, new AdviceWithRouteBuilder() {

        @Override
        public void configure() throws Exception {
            weaveById("createImportDocumentTraitement").after().to(mockEndpoint);
        }
    });

    // -- Launching the route
    camelContext.start();

    Exchange exchange = new DefaultExchange(camelContext);
    exchange.getIn().setHeader(TestExampleProcessor.HEADER_ENTREPRISE, company);
    exchange.getIn().setHeader(TestExampleProcessor.HEADER_UTILISATEUR, null); // No user in this case
    exchange.getIn().setHeader(TestExampleProcessor.HEADER_IMPORTDOCPROCESS, importDocumentProcess);

    long numberOfTraitementBefore = this.importDocumentTraitementDAO.countNumberOfImportDocumentTraitement();

    template.send(exchange);

    mockEndpoint.expectedMessageCount(1);
    mockEndpoint.assertIsSatisfied();

    camelContext.stop();

    long numberOfTraitementAfter = this.importDocumentTraitementDAO.countNumberOfImportDocumentTraitement();
    assertEquals(numberOfTraitementBefore + 1L, numberOfTraitementAfter);
}

Es ist auch möglich, die aktuelle Route zu einem anderen Prozess umzuleiten. Aber ich ziehe es vor, auf einen mockEndpoint . Es ist ein bisschen interessanter, weil Sie wirklich Zwischentests an Ihrem Körper und Kopf des Austauschs durchführen können.


WICHTIGER HINWEIS : In diesem Beispiel verwende ich den folgenden Code, um meine Routen adviceWith und adviceWith zu verwenden:

camelContext.getRouteDefinitions().get(0).adviceWith(camelContext, new AdviceWithRouteBuilder() { [...] });

Es ist jedoch möglich, die Route anhand einer zuvor als Zeichenfolge definierten ID abzurufen :

 camelContext.getRouteDefinition("routeId").adviceWith(camelContext, new AdviceWithRouteBuilder() {  [...]  });

Ich kann diese Methode wärmstens empfehlen. Sie kann viel Zeit sparen, um herauszufinden, warum Ihre Tests fehlschlagen