私は春のブートアプリを持っています、バージョン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クリーンインストールを実行すると、失敗します:(
誰もがこの注釈がラクダのテストに対して何をしているのか、またはどのようにそれが機能するようにそれを調整できるのかを知っていますか?
どうも
これが最後に機能したものです:
@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();
}
}
注釈@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();
}
}
お役に立てば幸いです。