227.7. 기존 엔드포인트 모킹
Camel 2.7부터 사용 가능
Camel을 사용하면 Camel 경로에서 기존 끝점을 자동으로 모을 수 있습니다.
작동 방식: 끝점이 여전히 작동합니다. 다르게 발생하는 것은 Mock 엔드포인트가 삽입되고 메시지를 먼저 수신한 다음 메시지를 대상 끝점에 위임한다는 것입니다. 일종의 인터셉트 및 위임 또는 끝점 리스너로 볼 수 있습니다.
아래에 지정된 경로가 있다고 가정합니다.
경로
@Override protected RouteBuilder createRouteBuilder() throws Exception { return new RouteBuilder() { @Override public void configure() throws Exception { from("direct:start").to("direct:foo").to("log:foo").to("mock:result"); from("direct:foo").transform(constant("Bye World")); } }; }
그런 다음 Camel의 adviceWith
기능을 사용하여 다음과 같이 단위 테스트에서 지정된 경로에 있는 모든 끝점을 모방할 수 있습니다.
모든 끝점을 모방하는 adviceWith
public void testAdvisedMockEndpoints() throws Exception { // advice the first route using the inlined AdviceWith route builder // which has extended capabilities than the regular route builder context.getRouteDefinitions().get(0).adviceWith(context, new AdviceWithRouteBuilder() { @Override public void configure() throws Exception { // mock all endpoints mockEndpoints(); } }); getMockEndpoint("mock:direct:start").expectedBodiesReceived("Hello World"); getMockEndpoint("mock:direct:foo").expectedBodiesReceived("Hello World"); getMockEndpoint("mock:log:foo").expectedBodiesReceived("Bye World"); getMockEndpoint("mock:result").expectedBodiesReceived("Bye World"); template.sendBody("direct:start", "Hello World"); assertMockEndpointsSatisfied(); // additional test to ensure correct endpoints in registry assertNotNull(context.hasEndpoint("direct:start")); assertNotNull(context.hasEndpoint("direct:foo")); assertNotNull(context.hasEndpoint("log:foo")); assertNotNull(context.hasEndpoint("mock:result")); // all the endpoints was mocked assertNotNull(context.hasEndpoint("mock:direct:start")); assertNotNull(context.hasEndpoint("mock:direct:foo")); assertNotNull(context.hasEndpoint("mock:log:foo")); }
mock 끝점에는 URI mock:<endpoint
>가 제공됩니다(예: mock:direct:foo
). Camel 로그 INFO
수준의 끝점은 다음과 같습니다.
INFO Adviced endpoint [direct://foo] with mock endpoint [mock:direct:foo]
모킹된 끝점은 매개변수가 없는경우
모킹된 끝점에는 매개변수가 제거됩니다. 예를 들어 엔드포인트 log:foo?showAll=true
는 다음 끝점 mock:log:foo
로 mocked됩니다. 매개 변수가 제거되었는지 확인합니다.
또한 패턴을 사용하여 특정 엔드포인트만 모방할 수 있습니다. 예를 들어 다음과 같이 수행하는 모든 로그
끝점을 모방하려면 다음을 수행합니다.
패턴을 사용하여 로그 끝점만 모킹하는 adviceWith
public void testAdvisedMockEndpointsWithPattern() throws Exception { // advice the first route using the inlined AdviceWith route builder // which has extended capabilities than the regular route builder context.getRouteDefinitions().get(0).adviceWith(context, new AdviceWithRouteBuilder() { @Override public void configure() throws Exception { // mock only log endpoints mockEndpoints("log*"); } }); // now we can refer to log:foo as a mock and set our expectations getMockEndpoint("mock:log:foo").expectedBodiesReceived("Bye World"); getMockEndpoint("mock:result").expectedBodiesReceived("Bye World"); template.sendBody("direct:start", "Hello World"); assertMockEndpointsSatisfied(); // additional test to ensure correct endpoints in registry assertNotNull(context.hasEndpoint("direct:start")); assertNotNull(context.hasEndpoint("direct:foo")); assertNotNull(context.hasEndpoint("log:foo")); assertNotNull(context.hasEndpoint("mock:result")); // only the log:foo endpoint was mocked assertNotNull(context.hasEndpoint("mock:log:foo")); assertNull(context.hasEndpoint("mock:direct:start")); assertNull(context.hasEndpoint("mock:direct:foo")); }
지원되는 패턴은 와일드카드 또는 정규식일 수 있습니다. Camel에서 사용하는 것과 동일한 일치 함수로 Intercept에 대한 자세한 내용을 참조하십시오.
mocking 끝점은 mock에 도착했을 때 메시지가 복사됩니다.
즉 Camel이 더 많은 메모리를 사용합니다. 이 방법은 많은 메시지를 보낼 때 적합하지 않을 수 있습니다.