Phanindra Gopishetty
Phanindra Gopishetty

Reputation: 169

Apache Camel - Create mock endpoint to listen to messages sent from within a processor

I have a route as follows:

                from(fromEndpoint).routeId("ticketRoute")
                .log("Received Tickets  : ${body}")
                .doTry()
                .process(exchange -> {
                    List<TradeTicketDto> ticketDtos = (List<TradeTicketDto>) exchange.getIn().getBody();
                    ticketDtos.stream()
                            .forEach(t -> solaceMessagePublisher.sendAsText("BOOKINGSERVICE.TICKET.UPDATED", t));
                    ticketToTradeConverter.convert(ticketDtos)
                            .forEach(t -> solaceMessagePublisher.sendAsText("BOOKINGSERVICE.TRADE.UPDATED", t));
                }).doCatch(java.lang.RuntimeException.class)
                .log(exceptionMessage().toString() + " --> ${body}");

solaceMessagePublisher is a utility class in application which performs some action on passed object (second argument) and finally converts it to json string and sends to a jms topic (first argument).

SolaceMessagePublisher.java

public void sendAsText(final String destinationKey, Object payload) {
        LOGGER.debug("Sending object as text to %s",destinationKey);
        String destinationValue = null;
        if (StringUtils.isNotEmpty(destinationKey)) {
            destinationValue = properties.getProperty(destinationKey);
        }
        LOGGER.debug("Identified Destination Value  = %s from key %s", destinationValue,destinationKey);
        if (StringUtils.isEmpty(destinationValue)) {
            throw new BaseServiceException("Invalid destination for message");
        }

        sendAsTextToDestination(destinationValue, payload);
    }

    public void sendAsTextToDestination(final String destinationValue, Object payload) {
        if (payload == null) {
            LOGGER.debug(" %s %s",EMPTY_PAYLOAD_ERROR_MESSAGE, destinationValue);
            return;
        }

        final String message = messageCreator.createMessageEnvelopAsJSON(payload, ContextProvider.getUserInContext());

        if (LOGGER.isDebugEnabled()) {
            LOGGER.debug("Created message = " + message);
        }
        jmsTemplate.send(destinationValue, new MessageCreator() {

            @Override
            public Message createMessage(Session session) throws JMSException {
                LOGGER.debug("Creating JMS Text Message");
                return session.createTextMessage(message);
            }
        });
    }

I am having a problem in creating a mock endpoint to listen to messages sent to this topic. Question is how to listen to the messages sent to a topic which is out of camel context?

I have tried in my Test using mock:jms:endpoint. It doesn't work.

My Test is as below

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { SiteMain.class })
public class TicketRouteCamelTest extends CamelSpringTestSupport{

    @Autowired
    protected BaseMessageEnvelopCreator messageCreator;

    private static final String MOCK_TICKET_UPDATED_QUEUE = "direct:mockTicketUpdated";

    @Before
    public void configureMockEndpoints() throws Exception {

        //mock input
        final AdviceWithRouteBuilder mockRouteAdvice = new AdviceWithRouteBuilder() {
            @Override
            public void configure() throws Exception {
                replaceFromWith(MOCK_TICKET_UPDATED_QUEUE);
            }
        };

        context().getRouteDefinition("ticketRoute").adviceWith(context(), mockRouteAdvice);
    }

    @Test
    public void testTicketRouteWithListOfTickets() throws Exception {
        //create test data
        TradeTicketDto tradeTicketDto = TradeTestDataHelper.getTradeTicketDto();

        //create an exchange and set its body with test data
        List<TradeTicketDto> list = new ArrayList<>();
        list.add(tradeTicketDto);
        list.add(tradeTicketDto);
        Exchange requestExchange = ExchangeBuilder.anExchange(context()).build();
        requestExchange.getIn().setBody(list);

        //create assert on the mock endpoints
        MockEndpoint mockTicketUpdatedEndpoint = getMockEndpoint("mock:DEV/bookingservice/ticket/updated");
        mockTicketUpdatedEndpoint.expectedBodiesReceived(
                messageCreator.createMessageEnvelopAsJSON(list.get(0), ContextProvider.getUserInContext()),
                messageCreator.createMessageEnvelopAsJSON(list.get(1), ContextProvider.getUserInContext()) );

        MockEndpoint mockTradeUpdatedEndpoint = getMockEndpoint("mock:DEV/bookingservice/trade/updated");
        mockTradeUpdatedEndpoint.expectedBodiesReceived(
                messageCreator.createMessageEnvelopAsJSON(list.get(0).getTicketInstruments().get(0), ContextProvider.getUserInContext()),
                messageCreator.createMessageEnvelopAsJSON(list.get(0).getTicketInstruments().get(1), ContextProvider.getUserInContext()),
                messageCreator.createMessageEnvelopAsJSON(list.get(1).getTicketInstruments().get(0), ContextProvider.getUserInContext()),
                messageCreator.createMessageEnvelopAsJSON(list.get(1).getTicketInstruments().get(1), ContextProvider.getUserInContext()));

        //send test exchange to request mock endpoint
        template.send(MOCK_TICKET_UPDATED_QUEUE, requestExchange);

        //test the asserts
        assertMockEndpointsSatisfied();
    }
}

On running test actual bodies received on mockendpont is 0

Upvotes: 1

Views: 1531

Answers (1)

Claus Ibsen
Claus Ibsen

Reputation: 55540

Mock is NOT a queue for consumers/producers to exchange data. Its a sink for testing purpose where you can setup expectations on the mock.

If you want to simulate a JMS via some kind of other means, then take a look at the stub component: http://camel.apache.org/stub

Its also listed in the bottom of the testing docs at: http://camel.apache.org/testing

Upvotes: 1

Related Questions