Spring boot 如何将JunitTest与Camel、ActiveMQ和外部API一起使用

Spring boot 如何将JunitTest与Camel、ActiveMQ和外部API一起使用,spring-boot,apache-camel,activemq,alfresco,Spring Boot,Apache Camel,Activemq,Alfresco,我正在尝试使用camel、activeMq和alfrescoapi设置junitest 我想测试的路线是: from(Constantes.Direct.DIRECT_GET_AUTHENTIFICATION_TICKET) .setBody().simple("{" + "\"userId\": \"userId\"," +"\"password\": \"password\""

我正在尝试使用camel、activeMq和alfrescoapi设置junitest

我想测试的路线是:

from(Constantes.Direct.DIRECT_GET_AUTHENTIFICATION_TICKET)
        .setBody().simple("{"
                        + "\"userId\": \"userId\","
                        +"\"password\": \"password\""
                        +"}")
        .setHeader(Exchange.HTTP_METHOD,constant(Constantes.Headers.HTTP_POST))
        .setHeader(Exchange.HTTP_URI,simple(Constantes.Urls.OBTENIR_TICKET))
    .to(Constantes.Urls.DUMMYHOST).convertBodyTo(String.class)
        .unmarshal().json(JsonLibrary.Jackson, TicketAlfresco.class).process(new Dumper())
        .process(new TokenBase64Proc())
        .setHeader(Constantes.Headers.SENDER, constant(Constantes.Headers.ALFRESCO))
        .setHeader(Constantes.Headers.API_ACTION, constant(SET_ALFRESCO_TOKEN))
        .setHeader(Constantes.Headers.HEADER_AUTHORIZATION, simple("${body}"))
    .inOut(Constantes.ActiveMq.ACTIVEMQ_IN)
    .end();
第一个“to”向Alfresco API发送请求并返回新令牌。 最后一个inOut将令牌发送到activeMQ

问题是,当我想要测试我的路由时,当测试到达activeMq内部的inOut时,测试失败,因为它没有得到任何答案

我需要安装并嵌入代理activeMQ还是需要模拟activeMQ?我该怎么做

为了让它运行,我使用:

mockEndpointsAndSkip("activemq:IN")
但我不确定这是个好办法

以下是我目前的测试:

@RunWith(SpringRunner.class)
@EnableAutoConfiguration
@ComponentScan(basePackages = {"fr.gif.wsp.web.service.alfresco*"})
公共类RouteGetThentificationTickettest扩展了CamelTest支持{

@Autowired private RouteGetAuthentificationTicket routeGetAuthentificationTicket;

//Route to test
private final static String FOURNISSEUR_GET_AUTHENTIFICATION_TICKET = Constantes.Direct.DIRECT_GET_AUTHENTIFICATION_TICKET;
private final static String MOCK_FOURNISSEUR_GET_AUTHENTIFICATION_TICKET = "mock:" + FOURNISSEUR_GET_AUTHENTIFICATION_TICKET;
// Mock result
private final static String MOCK_RESULT = "mock:result";
//Data
private final static String BODY = "Content of the body";

@Override
protected RoutesBuilder createRouteBuilder() {
    return routeGetAuthentificationTicket; 
}

@Before
public void setContextRoute() throws Exception  {
    context.getRouteDefinitions().get(0).adviceWith(context, new AdviceWithRouteBuilder() {
        @Override
        public void configure() throws Exception {
            mockEndpointsAndSkip("activemq:IN");
            weaveAddLast().to(MOCK_RESULT);
        }
    });
}

@Test
public void getAuthentificationTicket() throws InterruptedException {

    final MockEndpoint resultEndpoint = context.getEndpoint(MOCK_FOURNISSEUR_GET_AUTHENTIFICATION_TICKET, MockEndpoint.class);

    context.createProducerTemplate().sendBody(FOURNISSEUR_GET_AUTHENTIFICATION_TICKET, BODY);
    resultEndpoint.assertIsSatisfied();

    final Object result = context.createProducerTemplate().requestBody(FOURNISSEUR_GET_AUTHENTIFICATION_TICKET, BODY);
    assertNotNull(result);
}}

感谢您的时间

只需模拟activemq部分并返回您期望的实际消息。如果您真的想使用activemq,我想您可以使用嵌入式部分或使用docker启动activemq docker容器以用于测试。感谢您的回答@Souciance Eqdam Rashti,这样模拟activemq正确吗:weaveByT将(.*activemq:IN.*).replace()替换为(“mock:activemq:IN”);或者有其他方法可以这样做吗?您可以这样做,或者只需将其替换为包含实际响应消息的完整字符串…replace().body(“yourbody”)或者类似的。谢谢@Souciance Eqdam Rashti的回答,这似乎很有效!测试章节中的《骆驼行动》一书介绍了使用和模拟真实系统进行测试的不同策略。