メイン コンテンツをスキップする 補完的コンテンツへスキップ

ルートの単体テスト

単体テストは、プロフェッショナルなソフトウェア開発プロセスにおいて不可欠な部分です。このセクションでは、Apache Camelテストフレームワークを使用してルートの単体テストを行う方法を説明します。

ルートを作成

単体テストの例を示すため、最初にルートを作成します。このルートは、特定のディレクトリーからファイルを読み取り、そのファイルのメッセージをフィルタリングします。

Procedure

  1. [Palette] (パレット)からデザインワークスペースに、次のコンポーネントを配置します:
    • cFileコンポーネント
    • cConvertBodyToコンポーネント
    • cMessageFilterコンポーネント
    • cMessagingEndpointコンポーネント
    デザインワークスペース内のジョブのスクリーンショット。
  2. コンポーネントに、それぞれのロールがわかるようなラベルを付けます。[Row] (行) > [filter] (フィルター)接続を使って、cMessageFilterコンポーネントとcMessagingEndpointコンポーネントをリンクさせます。[Row] (行) > [Route] (ルート)接続を使って、前述するように他のコンポーネントをリンクさせます。
  3. cFileコンポーネントをダブルクリックし、[Component] (コンポーネント)タブで[Basic settings] (基本設定)ビューを開きます。次に示すように設定し、ローカルファイルシステムからファイルを読み取ります。
    [Basic settings] (基本設定)ビュー。
  4. cConvertBodyToコンポーネントをダブルクリックし、[Component] (コンポーネント)タブで[Basic settings] (基本設定)ビューを開きます。次のように設定して、各ファイルのメッセージの本文をString型に変換します。
    [Basic settings] (基本設定)ビュー。
  5. cMessageFilterコンポーネントをダブルクリックし、[Component] (コンポーネント)タブで[Basic settings] (基本設定)ビューを開きます。次のように設定して、式に基づいてメッセージの本文をフィルタリングします。
    ${body} contains 'bar'
    [Basic settings] (基本設定)ビュー。
  6. cMessagingEndpointコンポーネントをダブルクリックし、[Component] (コンポーネント)タブで[Basic settings] (基本設定)ビューを開きます。次のように設定して、ルートの出力をログに記録します。
    [Basic settings] (基本設定)ビュー。
  7. [Run] (実行)ビューで、[Run] (実行)ボタンをクリックしてルートを実行します。フィルター条件に一致するデータがコンソールに表示されます。
    ジョブの実行に成功した後のコンソール結果のスクリーンショット。

Results

ルートを作成する方法の詳細は、ルートを作成をご覧ください。

ルートをアーティファクトリポジトリーに公開する

Procedure

  1. [Repository] (リポジトリー)ツリービューでルートを右クリックし、コンテキストメニューで[Publish] (公開)を選択します。
    [Publish into Artifact Repository] (アーティファクトリポジトリーへ公開)ウィザードが開きます。
  2. デフォルト設定をそのままにし、[Finish] (終了)をクリックして、アーティファクトリポジトリーにルートを公開します。
    [Publish into Artifact Repository] (アーティファクトリポジトリーへ公開)ウィザード。

Results

これで、項目をリポジトリーでアーティファクトとして使用できます。

ルートの公開方法の詳細は、アーティファクトリポジトリーに公開をご覧ください。

単体テスト用のMavenプロジェクトを作成する

単体テストは、別のプロジェクトとして作成します。

Javaパースペクティブに切り替えて、単純なMavenベースのプロジェクトを作成する必要があります。

Procedure

  1. [Package Explorer] (パッケージエクスプローラー)の空白の部分を右クリックし、コンテキストメニューで[New] (新規) > [Project...] (プロジェクト...)の順に選択します。
  2. [New Project] (新規プロジェクト)ウィザードが開きます。[Maven]ノードの下の[MavenProject] (Mavenプロジェクト)を選択し、[Next] (次へ)をクリックします。
    [New Project] (新しいプロジェクト)ウィザード。
  3. [Select project name and location] (プロジェクト名と場所の選択)ビューで、[Use default Workspace location] (デフォルトのワークスペースの場所を使用する)オプションが選択されています。オプションをそのままにし、[Next] (次へ)をクリックします。
    [New Maven Project] (新しいMavenプロジェクト)ウィザード。
  4. [Select an Archetype] (アーキタイプを選択)ビューで、[GroupId] (グループID)フィールドではorg.apache.maven.archetypesが選択され、[ArtifactId] (アーティファクトID)フィールドではmaven-archetype-quickstartが選択されています。デフォルト設定をそのままにし、[Next] (次へ)をクリックします。
    [New Maven Project] (新しいMavenプロジェクト)ウィザード。
  5. [Specify Archetype parameters] (アーキタイプパラメーターの選択)ビューで、[Group Id] (グループID)フィールドにorg.talendと入力し、[Artifact Id] (アーティファクトID)フィールドにroute-unit-testと入力します。[Finish] (終了)をクリックします。プロジェクトが[Package Explorer] (パッケージエクスプローラー)に表示されます。
    [New Maven Project] (新しいMavenプロジェクト)ウィザード。
  6. 作成したばかりのプロジェクトノードの下にあるpom.xmlファイルをダブルクリックし、デザインワークスペースで開いたら、次のように編集します。
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>org.talend</groupId>
        <artifactId>route-unit-test</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <dependencies>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.8.1</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.apache.camel</groupId>
                <artifactId>camel-test</artifactId>
                <version>2.9.1</version>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-jdk14</artifactId>
                <version>1.6.1</version>
            </dependency>
            <dependency>
                <groupId>org.talend.camel</groupId>
                <artifactId>systemRoutines</artifactId>
                <version>1.0.0</version>
            </dependency>
            <dependency>
                <groupId>org.talend.camel</groupId>
                <artifactId>userRoutines</artifactId>
                <version>1.0.0</version>
            </dependency>
            <dependency>
                <groupId>org.example</groupId>
                <artifactId>SimpleRoute</artifactId>
                <version>0.2.0-SNAPSHOT</version>
                <type>jar</type>
            </dependency>
        </dependencies>
        <repositories>
            <repository>
                <id>repo-snapshot</id>
                <name>Snapshots bundles</name>
                <url>http://tadmin:tadmin@localhost:8082/archiva/repository/repo-snapshot/</url>
                <snapshots>
                    <enabled>true</enabled>
                </snapshots>
            </repository>
        </repositories>
    </project>

    前述したように、Mavenは、JunitとCamel単体テストフレームワーク、Talend ESBルートに必要なユーティリティJARファイル、Talend Studioから公開されたルートJARファイルに依存します。

    このユースケースでは、Talend Artifact Repositoryのルートを直接使用します。そのため、リポジトリーとしてpom.xmlファイルにルートを追加する必要があります。簡素化のため、ユーザー名とパスワードはリポジトリーURLに入っています。${Maven_HOME}/conf/settings.xml内にも指定できます。

  7. pom.xmlファイルを保存します。

ユーティリティJARファイルをローカルMavenリポジトリーに公開する

コマンドラインコンソールを開いて、ユーティリティJARファイルをローカルMavenリポジトリーにデプロイします。

Procedure

  1. 次のコマンドを実行し、システムルーチンをデプロイします: mvn install:install-file -DgroupId=org.talend.camel -DartifactId=systemRoutines -Dversion=1.0.0 -Dfile=./src/ext/systemRoutines.jar -Dpackaging=jar -DgeneratePom=true
  2. 次のコマンドを実行し、ユーザールーチンをデプロイします: mvn install:install-file -DgroupId=org.talend.camel -DartifactId=userRoutines -Dversion=1.0.0 -Dfile=./src/ext/userRoutines.jar -Dpackaging=jar -DgeneratePom=true

Results

これで、単体テストを行うために必要なすべての依存項目が整います。

JUnitテストを記述して実行する

Procedure

  1. [Package Explorer] (パッケージエクスプローラー)route-unit-testというMavenプロジェクトを右クリックし、コンテキストメニューで[New] (新規) > [JUnit Test Case] (JUnitテストケース)を選択します。
    [New JUnit Test Case] (新規JUnitテストケース)ウィザード。
    [New JUnit Test Case] (新規JUnitテストケース)ウィザードが開きます。
  2. [New JUnit 3 test] (新規JUnit 3テスト)を選択し、テストクラスの名前としてRouteTestSampleと入力します。[Finish] (終了)をクリックします。
  3. デザインワークスペースでテストクラスが開きます。次のようにテストを記述します。
    package org.talend.test;
    
    import java.util.Map;
    
    import org.apache.camel.CamelContext;
    import org.apache.camel.EndpointInject;
    import org.apache.camel.Produce;
    import org.apache.camel.ProducerTemplate;
    import org.apache.camel.builder.RouteBuilder;
    import org.apache.camel.component.mock.MockEndpoint;
    import org.apache.camel.test.junit4.CamelTestSupport;
    import org.junit.Test;
    
    import esbdemos.simpleroute_0_1.SimpleRoute;
    
    public class RouteTestSample extends CamelTestSupport {
    	@EndpointInject(uri = "mock:result")
    	protected MockEndpoint resultEndpoint;
    	@Produce(uri = "direct:start")
    	protected ProducerTemplate template;
    	private RouteBuilder builder;
    
    	@Test
    	public void testSendMatchingMessage() throws Exception {
    		String expectedBody = "bar";
    		resultEndpoint.expectedBodiesReceived(expectedBody);
    		template.sendBody(expectedBody);
    		resultEndpoint.assertIsSatisfied();
    	}
    
    	@Test
    	public void testSendNotMatchingMessage() throws Exception {
    		resultEndpoint.expectedMessageCount(0);
    		template.sendBody("foo");
    		resultEndpoint.assertIsSatisfied();
    	}
    
    	@Override
    	protected CamelContext createCamelContext() throws Exception {
    		SimpleRoute route = new SimpleRoute();
    		// Setup the test aliases
    		Map<String, String> uriProperties = route.getUriMap();
    		uriProperties.put("start", "direct:start");
    		uriProperties.put("end", "mock:result");
    		route.loadCustomUriMap(uriProperties);
    		// Build the route
    		builder = route.Route(false);
    		return builder.getContext();
    	}
    
    	@Override
    	protected RouteBuilder createRouteBuilder() {
    		return builder;
    	}
    }

    上述のように、ルートをテストするためにCamelテストフレームワークを使用します。ここでは、特別なmockエンドポイントを使って単体テスト中に結果を抽出する必要があります。ただし、作成したルートではそのようなmockエンドポイントを使用しません。通常のfileコンポーネントとlogコンポーネントが使用されます。この解決策として、fileコンポーネントとlogコンポーネントを、direct:startコンポーネントとmock:resultコンポーネントに置き換えます。49行から52行にMap<String,String>がありますが、これが、コンポーネント名をそのURIにマッピングし、startendの値を置き換えます。こうすることでコンポーネントのモックを作成し、分離した状態でルートをテストできます。

  4. ツールバーの[Run Job] (ジョブを実行)ボタンをクリックし、テストを実行します。
    JUnitタブ。

    テストは正しく実行されました。

このページは役に立ちましたか?

このページまたはコンテンツにタイポ、ステップの省略、技術的エラーなどの問題が見つかった場合はお知らせください。