295.4. 単体テスト Camel ルート
Service Component は 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
は単体テストの from
をオーバーライドします。
接頭辞を使用して、ルートが実行されるランタイム環境間の違いを処理できます。変更されていないバンドルを開発、テスト、および本番環境に移動することは、典型的な使用例です。
アノテーションからテスト設定を取得する
integration.prepare(null, ScrHelper.getScrProperties(integration.getClass().getName()));
ここでは、OSGi 環境で使用されるのと同じプロパティーを使用して、テストでサービスコンポーネントを設定します。
テスト用のコンポーネントのモック
// 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");
ここでは、テスト中のルートにメッセージを送信します。