274.4. Camel ルートのテスト
サービスコンポーネントは POJO で、OSGi 以外のユニットテストに対する特別な要件はありません。しかし、Camel SCR 固有の手法や、テストを簡単にする手法がいくつかあります。
以下は、camel-archetype-scr によって生成されたユニットテストの例です。
// This file was generated from org.apache.camel.archetypes/camel-archetype-scr/2.15-SNAPSHOT
package example;
import java.util.List;
import org.apache.camel.scr.internal.ScrHelper;
import org.apache.camel.builder.AdviceWithRouteBuilder;
import org.apache.camel.component.mock.MockComponent;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.model.ModelCamelContext;
import org.apache.camel.model.RouteDefinition;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestName;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
@RunWith(JUnit4.class)
public class CamelScrExampleTest {
Logger log = LoggerFactory.getLogger(getClass());
@Rule
public TestName testName = new TestName();
CamelScrExample integration;
ModelCamelContext context;
@Before
public void setUp() throws Exception {
log.info("*******************************************************************");
log.info("Test: " + testName.getMethodName());
log.info("*******************************************************************");
// Set property prefix for unit testing
System.setProperty(CamelScrExample.PROPERTY_PREFIX, "unit");
// Prepare the integration
integration = new CamelScrExample();
integration.prepare(null, ScrHelper.getScrProperties(integration.getClass().getName()));
context = integration.getContext();
// Disable JMX for test
context.disableJMX();
// Fake a component for test
context.addComponent("amq", new MockComponent());
}
@After
public void tearDown() throws Exception {
integration.stop();
}
@Test
public void testRoutes() throws Exception {
// Adjust routes
List<RouteDefinition> routes = context.getRouteDefinitions();
routes.get(0).adviceWith(context, new AdviceWithRouteBuilder() {
@Override
public void configure() throws Exception {
// Replace "from" endpoint with direct:start
replaceFromWith("direct:start");
// Mock and skip result endpoint
mockEndpoints("log:*");
}
});
MockEndpoint resultEndpoint = context.getEndpoint("mock:log:foo", MockEndpoint.class);
// resultEndpoint.expectedMessageCount(1); // If you want to just check the number of messages
resultEndpoint.expectedBodiesReceived("hello"); // If you want to check the contents
// Start the integration
integration.run();
// Send the test message
context.createProducerTemplate().sendBody("direct:start", "hello");
resultEndpoint.assertIsSatisfied();
}
}
それでは、1つずつ関心のあるビットを見てみましょう。
プロパティー接頭辞の使用
// Set property prefix for unit testing
System.setProperty(CamelScrExample.PROPERTY_PREFIX, "unit");
これにより、プロパティーの前に「unit」をプレフィックスして、設定の一部を上書きできます。たとえば、ユニットテストから unit. を上書きします。
from
接頭辞を使用すると、ルートが実行されるランタイム環境の相違点を処理できます。開発、テスト、および実稼働環境を介して変更されていないバンドルを移動することは、典型的なユースケースです。
アノテーションからのテスト設定の取得
integration.prepare(null, ScrHelper.getScrProperties(integration.getClass().getName()));
ここでは、OSGi 環境で使用されるプロパティーと同じプロパティーでテストの Service コンポーネントを設定します。
テスト用のコンポーネントのモック化
// Fake a component for test
context.addComponent("amq", new MockComponent());
テストで利用できないコンポーネントは、ルートの起動を許可するためにモック化できます。
テスト用のルートの調整
// Adjust routes
List<RouteDefinition> routes = context.getRouteDefinitions();
routes.get(0).adviceWith(context, new AdviceWithRouteBuilder() {
@Override
public void configure() throws Exception {
// Replace "from" endpoint with direct:start
replaceFromWith("direct:start");
// Mock and skip result endpoint
mockEndpoints("log:*");
}
});
Camel の AdviceWith 機能を使用すると、ルートをテスト用に変更できます。
ルートの起動
// Start the integration
integration.run();
ここでは、サービスコンポーネントとルートを起動します。
テストメッセージの送信
// Send the test message
context.createProducerTemplate().sendBody("direct:start", "hello");
ここでは、テスト中のルートにメッセージを送信します。