【发布时间】:2019-07-26 21:48:15
【问题描述】:
我正在尝试从我的 junit 测试路由 app.cash.source-endpoint-quartz,它在内部将流重定向到另一条路由 app.accrual.source-endpoint-direct。
在我的情况下,情况就像app.cash.source-endpoint-quartz 向 MQ 发送少量消息,之后处理继续并根据特定条件重定向到路由 app.accrual.source-endpoint-direct 并最终向同一个 MQ 发送更多消息。
我该如何测试?
现金路线
from("{{app.cash.source-endpoint-quartz}}")
.routeId("cash-route")
.log(LoggingLevel.INFO, logger,"***** CASH ROUTE STARTED *****")
.doTry()
...
....
.to("direct:cashTransactionRoute") //Sub Route
.process(c -> {
TransactionMaster transactionMaster = (TransactionMaster) c.getIn().getHeader(Constants.HEADER_TRANSACTION_MASTER_CASH);
transactionMasterService.updateMsgStatus(transactionMaster, Status.SUCCESS);
})
.bean(transactionManager, "markSuccess")
...
...
现金子路线
from("direct:cashTransactionRoute")
.routeId("cash-transaction-route")
...
.split(simple("${body}"))
.parallelProcessing()
...
.end()// End of split() and parallelProcessing()
.end()
.process(e -> {
...
})
.choice()
.when(simple("${body.size} != 0"))
.process(e -> {
e.getIn().getBody();
})
.to("{{app.accrual.source-endpoint-direct}}") //Redirect to accrual route
.end() //End of choice
.end();
应计路线
from("{{app.accrual.source-endpoint-direct}}") //Accrual Route
.routeId("accrual-route")
.log(LoggingLevel.INFO, logger,"***** ACCRUAL ROUTE STARTED *****")
...
...
application-test.yaml
app:
cash:
source-endpoint-quartz: direct-vm:cash
txn-type: CASH
accrual:
source-endpoint-direct: direct-vm:accrual
source-endpoint-quartz-1: direct-vm:accrual-quartz-1
source-endpoint-quartz-2: direct-vm:accrual-quartz-2
下面是我尝试过但出现错误的 JUnit。
@RunWith(CamelSpringBootRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, properties = {"camel.springboot.java-routes-include-pattern=**/Cash*, **/Accrual*"})
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, SecurityAutoConfiguration.class})
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
@ActiveProfiles(profiles = {"test"})
public class CashRouteTest {
@EndpointInject(value = "{{app.cash.source-endpoint-quartz}}")
private ProducerTemplate producerTemplate;
@EndpointInject(value = "{{app.accrual.source-endpoint-direct}}")
private ProducerTemplate producerTemplateAccrual;
@EndpointInject(value = "{{app.mqservice}}")
private MockEndpoint mock;
@Test
public void cashRouteTest_PaymentWithAccrual() throws Exception {
Mockito.when(...).thenReturn(.....);
Mockito.when(...).thenReturn(.....);
...
producerTemplateAccrual.start();
producerTemplate.start();
producerTemplate.sendBody(null);
//producerTemplateAccrual.sendBody(null);
mock.expectedMessageCount(4);
mock.expectedBodiesReceived();
Assert.assertEquals(4, mock.getExchanges().size());
String xml = String.valueOf(mock.getExchanges().get(0).getIn().getBody());
MessageEnvelope messageEnvelope = (MessageEnvelope) XmlUtil.toObject(xml);
String actualPayload = XmlUtil.toXml(messageEnvelope.getPayload());
String expectedPayload = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>....";
Collection<TransactionMaster> txnMasters = (Collection<TransactionMaster>) txnMasterRepo.findAll();
Collection<Transaction> txns = (Collection<Transaction>) txnRepo.findAll();
logger.info("actualPayload : {} ", actualPayload);
Assert.assertEquals(expectedPayload, actualPayload);
Assert.assertEquals(2, txnMasters.size());
Assert.assertEquals(4, txns.size());
Assert.assertEquals(Status.SUCCESS, Status.forValue(txnMasters.iterator().next().getRefStatusId()));
Assert.assertEquals(Status.SUCCESS, Status.forValue(txns.iterator().next().getRefStatusId()));
mock.assertIsSatisfied(5000);
}
}
当我运行这个 JUnit 时,我得到以下错误。
2019-07-25 10:36:47,179 [main] INFO o.a.camel.spring.SpringCamelContext - Route: cash-route started and consuming from: direct-vm://cash
2019-07-25 10:36:47,179 [main] INFO o.a.camel.spring.SpringCamelContext - Route: cash-enrich-route started and consuming from: direct://cashEnrichRoute
2019-07-25 10:36:47,179 [main] INFO o.a.camel.spring.SpringCamelContext - Route: cash-transaction-route started and consuming from: direct://cashTransactionRoute
2019-07-25 10:36:47,179 [main] INFO o.a.camel.spring.SpringCamelContext - Total 3 routes, of which 3 are started
Message History
---------------------------------------------------------------------------------------------------------------------------------------
RouteId ProcessorId Processor Elapsed (ms)
[cash-route ] [cash-route ] [direct-vm://cash ] [ 32018]
[cash-route ] [log1 ] [log ] [ 9]
[cash-route ] [doTry1 ] [doTry ] [ 0]
[cash-route ] [bean1 ] [bean[com.app.service.DbTransactionManager] ] [ 500]
[cash-route ] [bean2 ] [bean[com.app.service.CashTransactionSearch] ] [ 15]
[cash-route ] [choice1 ] [when[simple{Simple: ${body.size} == 0}]choice[] ] [ 204]
[cash-route ] [process1 ] [Processor@0x20bc4c09 ] [ 15]
[cash-route ] [process2 ] [Processor@0x1ca6323c ] [ 16]
[cash-route ] [to1 ] [direct:cashEnrichRoute ] [ 130]
[cash-enrich-route ] [split1 ] [split[Simple: ${body}] ] [ 130]
[cash-route ] [process3 ] [Processor@0x5aac9d67 ] [ 235]
[cash-route ] [process4 ] [Processor@0x753cc26d ] [ 75]
[cash-route ] [to2 ] [direct:cashTransactionRoute ] [ 0]
[cash-transaction-r] [split2 ] [split[Simple: ${body}] ] [ 385]
[cash-transaction-r] [process16 ] [Processor@0x20b3bbe7 ] [ 0]
[cash-transaction-r] [choice3 ] [when[simple{Simple: ${body.size} != 0}]choice[] ] [ 0]
[cash-transaction-r] [process17 ] [Processor@0x5190ae57 ] [ 0]
[cash-transaction-r] [to5 ] [{{app.accrual.source-endpoint-direct}} ] [ 0]
Stacktrace
---------------------------------------------------------------------------------------------------------------------------------------
org.apache.camel.component.directvm.DirectVmConsumerNotAvailableException: No consumers available on endpoint: direct-vm://accrual. Exchange[ID-SPLS1800411-10N-1564022207351-0-3]
我看到,当它加载上下文时,它不会启动应计路线。即使我在 junit 中指定了producerTemplateAccrual.start();。
2019-07-25 10:36:47,179 [main] INFO o.a.camel.spring.SpringCamelContext - Route: cash-route started and consuming from: direct-vm://cash
2019-07-25 10:36:47,179 [main] INFO o.a.camel.spring.SpringCamelContext - Route: cash-enrich-route started and consuming from: direct://cashEnrichRoute
2019-07-25 10:36:47,179 [main] INFO o.a.camel.spring.SpringCamelContext - Route: cash-transaction-route started and consuming from: direct://cashTransactionRoute
2019-07-25 10:36:47,179 [main] INFO o.a.camel.spring.SpringCamelContext - Total 3 routes, of which 3 are started
【问题讨论】:
-
Junit5 在 Apache Camel 中尚不支持。亚历克斯正在处理这个issues.apache.org/jira/browse/CAMEL-13342
-
ProducerTemplate 和路由不一样。模板用于发送消息,路由用于路由消息。确保您看到的未开始的路线是您测试的一部分,例如它是由 spring/camel 发现的,或者您需要手动添加它等。由于您没有为该部分显示这么多代码等,所以很难说清楚。跨度>
标签: apache-camel junit5