Apache camel ApacheCamel-创建模拟端点以侦听从处理器内发送的消息

Apache camel ApacheCamel-创建模拟端点以侦听从处理器内发送的消息,apache-camel,Apache Camel,我的路线如下: from(fromEndpoint).routeId("ticketRoute") .log("Received Tickets : ${body}") .doTry() .process(exchange -> { List<TradeTicketDto> ticketDtos = (List

我的路线如下:

                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}");
我在创建模拟端点以侦听发送到此主题的消息时遇到问题。问题是如何收听发送到上下文之外的主题的消息

我已经在测试中尝试使用mock:jms:endpoint。它不起作用

我的测试如下

@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();
    }
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(类={SiteMain.class})
公共类TicketRouteCamelTest扩展了CamelSpringTestSupport{
@自动连线
受保护的BaseMessageEnvelopeCreator-messageCreator;
私有静态最终字符串MOCK\u TICKET\u UPDATED\u QUEUE=“direct:mockTicketUpdated”;
@以前
public void configureMockEndpoints()引发异常{
//模拟输入
带有RouteBuilder的最终Advice MockRouteDevice=带有RouteBuilder的新Advice(){
@凌驾
public void configure()引发异常{
替换为(模拟票据更新队列);
}
};
context().getRouteDefinition(“ticketRoute”).adviceWith(context(),mockRouteDevice);
}
@试验
public void testTicketRouteWithListOfTickets()引发异常{
//创建测试数据
TradeTicketDto TradeTicketDto=TradeTestDataHelper.getTradeTicketDto();
//创建一个exchange并用测试数据设置其主体
列表=新的ArrayList();
列表。添加(TradeTicketTo);
列表。添加(TradeTicketTo);
Exchange-requestExchange=ExchangeBuilder.anExchange(context()).build();
requestExchange.getIn().setBody(列表);
//在模拟端点上创建断言
MockEndpoint mockticketupdatendpoint=getMockEndpoint(“mock:DEV/bookingservice/ticket/updated”);
MockTicketUpdateEndPoint.ExpectedBody已接收(
messageCreator.CreateMessageEnvelopeasJSON(list.get(0),ContextProvider.getUserInContext()),
messageCreator.createMessageEnvelopeasJSON(list.get(1),ContextProvider.getUserInContext());
MockEndpoint mockTradeUpdateEndpoint=getMockEndpoint(“mock:DEV/bookingservice/trade/updated”);
MockTradeUpdatedPoint.expectedBodiesReceived(
messageCreator.CreateMessageEnvelopeasJSON(list.get(0).getTicketInstruments().get(0),ContextProvider.getUserInContext()),
messageCreator.CreateMessageEnvelopeasJSON(list.get(0).getTicketInstruments().get(1),ContextProvider.getUserInContext()),
messageCreator.CreateMessageEnvelopeasJSON(list.get(1).getTicketInstruments().get(0),ContextProvider.getUserInContext()),
messageCreator.createMessageEnvelopeasJSON(list.get(1).getTicketInstruments().get(1),ContextProvider.getUserInContext());
//将测试交换发送到请求模拟端点
发送(模拟票据更新队列,请求交换);
//测试断言
AssertMockEndpointsAssertified();
}
}

运行测试时,mockendpont上接收的实际实体为0

Mock不是消费者/生产者交换数据的队列。它是一个用于测试的接收器,您可以在模拟上设置期望值

如果您希望通过某种其他方式模拟JMS,请查看存根组件:


它也列在测试文档的底部:

您所说的脱离camel上下文的主题是什么意思?正如您所看到的,消息是使用jmsTemplate发送到一个主题的,而不是使用camel组件,如.to(jms:topicendpoint)。如果是这样做的话,那么使用AdviceWithRouteBuilder进行模拟就很容易了。如何将对象放入队列/主题并不重要。Camel可以侦听该特定主题/队列。Camel无法侦听该主题。我试过使用mock:topicendpoint你为什么要使用mock?mock用于特定目的,例如测试如何在下面的部分中存根
jmsTemplate.send(destinationValue,newmessagecreator(){@Override public Message createMessage(会话会话)抛出JMSException{LOGGER.debug(“创建JMS文本消息”);return session.createTextMessage(message);})它不是路线的一部分,因此我可以使用AdviceWith。它是处理器的一部分
@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();
    }
}