web-dev-qa-db-ja.com

@SpringBootTestによるスプリングブートとラクダのテスト

私は春のブートアプリを持っています、バージョン1.5.8の春のブートとそこにcamel 2.20.1

簡単なルート:

@Component
public class MyRoute extends RouteBuilder {

  public static final String IN = "file://in";

  public static final String OUT = "file://out";

  @Override
  public void configure() throws Exception {
    from(IN).routeId("myId").to(OUT);
  }
}

簡単なテスト:

//@SpringBootTest
public class MyRouteTest extends CamelTestSupport {


      @Produce(uri = MyRoute.IN)
      private ProducerTemplate producerTemplate;

      @EndpointInject(uri = "mock:file:out")
      private MockEndpoint mockEndpointOut;

      @Override
      public String isMockEndpoints() {
        return "*";
      }

      @Test
      public void simpleTest() throws Exception {
        mockEndpointOut.expectedMessageCount(1);
        producerTemplate.sendBody("Test");
        mockEndpointOut.assertIsSatisfied();
      }

      @Override
      protected RoutesBuilder createRouteBuilder() throws Exception {
        return new MyRoute();
      }

    }

このテストを実行すると、正常に実行され、メッセージが1つ表示され、エンドポイントが満たされます。 @SpringBootTestアノテーションを追加すると、テストは失敗しますか?どうして ?また、注釈なしでmavenクリーンインストールを実行すると、失敗します:(

誰もがこの注釈がラクダのテストに対して何をしているのか、またはどのようにそれが機能するようにそれを調整できるのかを知っていますか?

どうも

6
bijesanu

これが最後に機能したものです:

@RunWith(CamelSpringBootRunner.class)
@SpringBootTest
@MockEndpoints
public class MyRouteTest2 {

  @Autowired
  private ProducerTemplate producerTemplate;

  @EndpointInject(uri = "mock:file:out")
  private MockEndpoint mockCamel;

  @Test
  public void test() throws InterruptedException {
    String body = "Camel";
    mockCamel.expectedMessageCount(1);

    producerTemplate.sendBody("file:in", body);

    mockCamel.assertIsSatisfied();
  }
}
7
bijesanu

注釈@RunWith(CamelSpringBootRunner.class)を追加してみてください。 docs によると:

CamelSpringTestSupportの機能をSpring Boot Testベースのテストケースにもたらす実装。このアプローチにより、開発者は、テスト開発用の一般的なSpringテスト規約を使用して、Spring Bootベースのアプリケーション/ルートのテストを実装できます。

また、@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)および@DisableJmx(true)の追加を検討してください。最初のテストでは、各テストメソッドの後にSpringコンテキストをクリアします。これにより、同じテストケースで他のテストから残される結果(明らかに理由のないテストの失敗など)が回避されます。

後者では、テストでJMXを使用する必要がないため、JMXを無効にします。

official docs には、Spring BootでのApache Camelの実行に関する詳細情報があります。ここからの例の抜粋:

@ActiveProfiles("test")
@RunWith(CamelSpringBootRunner.class)
@SpringBootTest
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
@DisableJmx(true)
public class MyRouteTest extends CamelTestSupport {

    @Autowired
    private CamelContext camelContext;

    @Override
    protected CamelContext createCamelContext() throws Exception {
        return camelContext;
    }

    @EndpointInject(uri = "direct:myEndpoint")
    private ProducerTemplate endpoint;

    @Override
    public void setUp() throws Exception {
        super.setUp();
        RouteDefinition definition = context().getRouteDefinitions().get(0);
        definition.adviceWith(context(), new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                onException(Exception.class).maximumRedeliveries(0);
            }
        });
    }

    @Override
    public String isMockEndpointsAndSkip() {
            return "myEndpoint:put*";
    }

    @Test
    public void shouldSucceed() throws Exception {
        assertNotNull(camelContext);
        assertNotNull(endpoint);

        String expectedValue = "expectedValue";
        MockEndpoint mock = getMockEndpoint("mock:myEndpoint:put");
        mock.expectedMessageCount(1);
        mock.allMessages().body().isEqualTo(expectedValue);
        mock.allMessages().header(MY_HEADER).isEqualTo("testHeader");
        endpoint.sendBodyAndHeader("test", MY_HEADER, "testHeader");

        mock.assertIsSatisfied();
    }
}

お役に立てば幸いです。

5
Ricardo Zanini