Spring boot 如何将JunitTest与Camel、ActiveMQ和外部API一起使用
我正在尝试使用camel、activeMq和alfrescoapi设置junitest 我想测试的路线是: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\""
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的回答,这似乎很有效!测试章节中的《骆驼行动》一书介绍了使用和模拟真实系统进行测试的不同策略。