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.

Reply via email to