You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@camel.apache.org by Kai Broszat <Ka...@kewill.com> on 2015/11/13 14:08:49 UTC

Camel + SpringBoot + Endpoint Mocking

Hi,
I want to test a complex route that involves sending messages to ActiveMQ and calling webservices with SpringWs.
The route itself is working fine using spring-boot (1.2.7.RELEASE) and the camel-spring-boot plugin (2.16.0).

Here are the important parts of the code:

@Component
public class MyRoute extends SpringRouteBuilder {
    @Override
    public void configure() throws Exception {
        from(direct:responseQueue)
                .transacted()
.split(...)
.to(activemq:individual_persist_queue)
.end()
                .to("spring-ws:http://localhost:8088/acknowledge_webservice")
                .log("DONE");
    }
}

Now I want to test this route by mocking the activemq and spring-ws endpoints so the test can be run without any dependency on the broker or the webserver.
My basic requirement is to verify that the right amount of messages are sent to each endpoint.

In my current scenario, the original message is split into three parts which should be sent to ActiveMQ, followed by a single acknowledge message to the WebService.
The transaction is there to roll-back the JMS deliveries in case the web-service call fails. None of that should be important for this test however.

My test looks as follows:

@RunWith(CamelSpringJUnit4ClassRunner.class)
@BootstrapWith(CamelTestContextBootstrapper.class)
@SpringApplicationConfiguration(classes = MyConfig.class)
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
@MockEndpointsAndSkip
public class CamelSpringBootTest {

    @Produce(uri = "direct:responseQueue ")
    protected ProducerTemplate template;

    @EndpointInject(uri = "mock: spring-ws:http://localhost:8088/acknowledge_webservice")
    MockEndpoint webserviceMock;

    @EndpointInject(uri = "mock:activemq:individual_persist_queue ")
    MockEndpoint activemqMock;


    @Test
    public void test() throws Exception {
        activemqMock.expectedMessageCount(3);
        webserviceMock.expectedMessageCount(1);

        template.sendBody(someXML);

        MockEndpoint.assertIsSatisfied(10L, TimeUnit.SECONDS, toKcxMock);
    }
}

When I run the test with the webservice and ActiveMQ available then everything works as expected.
The assertions fail however as the mock endpoints don't register any messages.

If I disable the ActiveMQ broker, then I get 'Connection refused' exceptions from the ActiveMQ component.
As far as I understand Camel shouldn't have tried to send the messages to ActiveMQ though because of the @MockEndpointsAndSkip annotation.

What am I missing?

Thanks for any suggestion,
Kai

IMPORTANT NOTICE: This email is intended solely for the use of the individual to whom it is addressed and may contain information that is privileged, confidential or otherwise exempt from disclosure under applicable law. If the reader of this email is not the intended recipient or the employee or agent responsible for delivering the message to the intended recipient, you are hereby notified that any dissemination, distribution, or copying of this communication is strictly prohibited. If you have received this communication in error, please immediately return the original message to the sender at the listed email address. In accordance with Kewill policy, emails sent and received may be monitored. Although Kewill takes reasonable precautions to minimize the risk, Kewill accepts no responsibility for any loss or damage should this email contain any virus, or similar destructive or mischievous code.

RE: Camel + SpringBoot + Endpoint Mocking

Posted by Kai Broszat <Ka...@kewill.com>.
Thanks Joakim,
I have seen this thread already.

For now I resorted to the suggested solution of moving endpoint definitions to properties.
My next problem is to assert that a rollback has happened but I'll open another thread for that if necessary.

Cheers,
Kai

> -----Original Message-----
> From: Joakim Bjørnstad [mailto:joakibj@gmail.com]
> Sent: Tuesday, November 17, 2015 6:37 AM
> To: users@camel.apache.org
> Subject: Re: Camel + SpringBoot + Endpoint Mocking
> 
> Hello,
> 
> Please see this thread:
> http://camel.465427.n5.nabble.com/spring-boot-test-mocks-td5773902.html
> 
> In summary, @MockEndpoints and @MockEndpointsAndSkip are not supported
> in Camel thus far (2.16.0).
> 
> On Fri, Nov 13, 2015 at 2:08 PM, Kai Broszat <Ka...@kewill.com> wrote:
> > Hi,
> > I want to test a complex route that involves sending messages to ActiveMQ
> and calling webservices with SpringWs.
> > The route itself is working fine using spring-boot (1.2.7.RELEASE) and the
> camel-spring-boot plugin (2.16.0).
> >
> > Here are the important parts of the code:
> >
> > @Component
> > public class MyRoute extends SpringRouteBuilder {
> >     @Override
> >     public void configure() throws Exception {
> >         from(direct:responseQueue)
> >                 .transacted()
> > .split(...)
> > .to(activemq:individual_persist_queue)
> > .end()
> >                 .to("spring-ws:http://localhost:8088/acknowledge_webservice")
> >                 .log("DONE");
> >     }
> > }
> >
> > Now I want to test this route by mocking the activemq and spring-ws endpoints
> so the test can be run without any dependency on the broker or the webserver.
> > My basic requirement is to verify that the right amount of messages are sent to
> each endpoint.
> >
> > In my current scenario, the original message is split into three parts which
> should be sent to ActiveMQ, followed by a single acknowledge message to the
> WebService.
> > The transaction is there to roll-back the JMS deliveries in case the web-service
> call fails. None of that should be important for this test however.
> >
> > My test looks as follows:
> >
> > @RunWith(CamelSpringJUnit4ClassRunner.class)
> > @BootstrapWith(CamelTestContextBootstrapper.class)
> > @SpringApplicationConfiguration(classes = MyConfig.class)
> > @DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
> > @MockEndpointsAndSkip public class CamelSpringBootTest {
> >
> >     @Produce(uri = "direct:responseQueue ")
> >     protected ProducerTemplate template;
> >
> >     @EndpointInject(uri = "mock: spring-
> ws:http://localhost:8088/acknowledge_webservice")
> >     MockEndpoint webserviceMock;
> >
> >     @EndpointInject(uri = "mock:activemq:individual_persist_queue ")
> >     MockEndpoint activemqMock;
> >
> >
> >     @Test
> >     public void test() throws Exception {
> >         activemqMock.expectedMessageCount(3);
> >         webserviceMock.expectedMessageCount(1);
> >
> >         template.sendBody(someXML);
> >
> >         MockEndpoint.assertIsSatisfied(10L, TimeUnit.SECONDS, toKcxMock);
> >     }
> > }
> >
> > When I run the test with the webservice and ActiveMQ available then
> everything works as expected.
> > The assertions fail however as the mock endpoints don't register any
> messages.
> >
> > If I disable the ActiveMQ broker, then I get 'Connection refused' exceptions
> from the ActiveMQ component.
> > As far as I understand Camel shouldn't have tried to send the messages to
> ActiveMQ though because of the @MockEndpointsAndSkip annotation.
> >
> > What am I missing?
> >
> > Thanks for any suggestion,
> > Kai
> >
> > IMPORTANT NOTICE: This email is intended solely for the use of the individual
> to whom it is addressed and may contain information that is privileged,
> confidential or otherwise exempt from disclosure under applicable law. If the
> reader of this email is not the intended recipient or the employee or agent
> responsible for delivering the message to the intended recipient, you are hereby
> notified that any dissemination, distribution, or copying of this communication is
> strictly prohibited. If you have received this communication in error, please
> immediately return the original message to the sender at the listed email
> address. In accordance with Kewill policy, emails sent and received may be
> monitored. Although Kewill takes reasonable precautions to minimize the risk,
> Kewill accepts no responsibility for any loss or damage should this email contain
> any virus, or similar destructive or mischievous code.
> 
> 
> 
> --
> Kind regards
> Joakim Bjørnstad

Re: Camel + SpringBoot + Endpoint Mocking

Posted by Joakim Bjørnstad <jo...@gmail.com>.
Hello,

Please see this thread:
http://camel.465427.n5.nabble.com/spring-boot-test-mocks-td5773902.html

In summary, @MockEndpoints and @MockEndpointsAndSkip are not supported
in Camel thus far (2.16.0).

On Fri, Nov 13, 2015 at 2:08 PM, Kai Broszat <Ka...@kewill.com> wrote:
> Hi,
> I want to test a complex route that involves sending messages to ActiveMQ and calling webservices with SpringWs.
> The route itself is working fine using spring-boot (1.2.7.RELEASE) and the camel-spring-boot plugin (2.16.0).
>
> Here are the important parts of the code:
>
> @Component
> public class MyRoute extends SpringRouteBuilder {
>     @Override
>     public void configure() throws Exception {
>         from(direct:responseQueue)
>                 .transacted()
> .split(...)
> .to(activemq:individual_persist_queue)
> .end()
>                 .to("spring-ws:http://localhost:8088/acknowledge_webservice")
>                 .log("DONE");
>     }
> }
>
> Now I want to test this route by mocking the activemq and spring-ws endpoints so the test can be run without any dependency on the broker or the webserver.
> My basic requirement is to verify that the right amount of messages are sent to each endpoint.
>
> In my current scenario, the original message is split into three parts which should be sent to ActiveMQ, followed by a single acknowledge message to the WebService.
> The transaction is there to roll-back the JMS deliveries in case the web-service call fails. None of that should be important for this test however.
>
> My test looks as follows:
>
> @RunWith(CamelSpringJUnit4ClassRunner.class)
> @BootstrapWith(CamelTestContextBootstrapper.class)
> @SpringApplicationConfiguration(classes = MyConfig.class)
> @DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
> @MockEndpointsAndSkip
> public class CamelSpringBootTest {
>
>     @Produce(uri = "direct:responseQueue ")
>     protected ProducerTemplate template;
>
>     @EndpointInject(uri = "mock: spring-ws:http://localhost:8088/acknowledge_webservice")
>     MockEndpoint webserviceMock;
>
>     @EndpointInject(uri = "mock:activemq:individual_persist_queue ")
>     MockEndpoint activemqMock;
>
>
>     @Test
>     public void test() throws Exception {
>         activemqMock.expectedMessageCount(3);
>         webserviceMock.expectedMessageCount(1);
>
>         template.sendBody(someXML);
>
>         MockEndpoint.assertIsSatisfied(10L, TimeUnit.SECONDS, toKcxMock);
>     }
> }
>
> When I run the test with the webservice and ActiveMQ available then everything works as expected.
> The assertions fail however as the mock endpoints don't register any messages.
>
> If I disable the ActiveMQ broker, then I get 'Connection refused' exceptions from the ActiveMQ component.
> As far as I understand Camel shouldn't have tried to send the messages to ActiveMQ though because of the @MockEndpointsAndSkip annotation.
>
> What am I missing?
>
> Thanks for any suggestion,
> Kai
>
> IMPORTANT NOTICE: This email is intended solely for the use of the individual to whom it is addressed and may contain information that is privileged, confidential or otherwise exempt from disclosure under applicable law. If the reader of this email is not the intended recipient or the employee or agent responsible for delivering the message to the intended recipient, you are hereby notified that any dissemination, distribution, or copying of this communication is strictly prohibited. If you have received this communication in error, please immediately return the original message to the sender at the listed email address. In accordance with Kewill policy, emails sent and received may be monitored. Although Kewill takes reasonable precautions to minimize the risk, Kewill accepts no responsibility for any loss or damage should this email contain any virus, or similar destructive or mischievous code.



-- 
Kind regards
Joakim Bjørnstad