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上接收的实际实体为0Mock不是消费者/生产者交换数据的队列。它是一个用于测试的接收器,您可以在模拟上设置期望值 如果您希望通过某种其他方式模拟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();
}
}