Модульное тестирование с использованием Apache Camel - PullRequest
0 голосов
/ 26 февраля 2019

Я хочу проверить ниже верблюжий маршрут.Все примеры, которые я нахожу в сети, имеют маршрут, начинающийся с файла, где, как и в моем случае, у меня есть метод Spring Bean, который вызывается каждые несколько минут, и, наконец, сообщение преобразуется и перемещается в jms, а также в каталог аудита.

Я не очень разбираюсь в тесте записи для этого маршрута.Все, что у меня есть в моем тестовом случае, это Mockito.when(tradeService.searchTransaction()).thenReturn(dataWithSingleTransaction);

from("quartz2://tsTimer?cron=0/20+*+8-18+?+*+MON,TUE,WED,THU,FRI+*")
.bean(TradeService.class)
.marshal()
.jacksonxml(true)
.to("jms:queue:out-test")
.to("file:data/test/audit")
.end();

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

@ рука NOD Спасибо за ваши подсказки, я шел в совершенно неверном направлении.Прочитав ваш ответ, я смог написать базовый тест, и из этого я думаю, что смогу продвинуть его.

Цените ваше время, однако я вижу, что на основе моего маршрута он должен поместить XML-файл в каталог аудита, чего не происходит.

Похоже, что промежуточные шаги тоже насмехаются, но я ничего не указывал

InterceptSendToMockEndpointStrategy - Adviced endpoint [xslt://trans.xslt] with mock endpoint [mock:xslt:trans.xslt]
INFO  o.a.c.i.InterceptSendToMockEndpointStrategy - Adviced endpoint [file://test/data/audit/?fileName=%24%7Bheader.outFileName%7D] with mock endpoint [mock:file:test/data/audit/]
INFO  o.a.camel.spring.SpringCamelContext - StreamCaching is not in use. If using streams then its recommended to enable stream caching. See more details at http://camel.apache.org/stream-caching.html

TradePublisherRoute.java

    @Override
    public void configure() throws Exception {
        logger.info("TradePublisherRoute.configure() : trade-publisher started configuring camel route.");

        from("{{trade-publisher.sourceEndpoint}}")
        .doTry()
            .bean(tradeService)
            .process(new Processor() {
                @Override
                public void process(Exchange exchange) throws Exception {
                    String dateStr = Constant.dateFormatForFileName.format(new Date());
                    logger.info("this is getting executed : " + dateStr);
                    exchange.setProperty(Constant.KEY_INCOMING_XML_FILE_NAME, "REQ-" + dateStr + Constant.AUDIT_FILE_EXTENSION);
                    exchange.setProperty(Constant.KEY_OUTGOING_XML_FILE_NAME, "RESP-" + dateStr + Constant.AUDIT_FILE_EXTENSION);
                }
            })
            .marshal()
            .jacksonxml(true)
            .wireTap("{{trade-publisher.requestAuditDir}}" + "${header.inFileName}")
            .to("{{trade-publisher.xsltFile}}")
            .to("{{trade-publisher.outboundQueue}}")
            .to("{{trade-publisher.responseAuditDir}}" + "${header.outFileName}")
            .bean(txnService, "markSuccess")
        .endDoTry()
        .doCatch(Exception.class)
            .bean(txnService, "markFailure")
            .log(LoggingLevel.ERROR, "EXCEPTION: ${exception.stacktrace}")
        .end();

TradePublisherRouteTest.java

@ActiveProfiles("test")
@RunWith(CamelSpringBootRunner.class)
@SpringBootTest(classes = TradePublisherApplication.class)
@MockEndpoints
public class TradePublisherRouteTest {

    @EndpointInject(uri = "{{trade-publisher.outboundQueue}}")
    private MockEndpoint mockQueue;

    @EndpointInject(uri = "{{trade-publisher.sourceEndpoint}}")
    private ProducerTemplate producerTemplate;

    @MockBean
    TradeService tradeService;

    private List<Transaction> transactions = new ArrayList<>();

    @BeforeClass
    public static void beforeClass() {

    }

    @Before
    public void before() throws Exception {
        Transaction txn = new Transaction("TEST001", "C001", "100", "JPM", new BigDecimal(100.50), new Date(), new Date(), 1000, "P");
        transactions.add(txn);

    }

    @Test
    public void testRouteConfiguration() throws Exception {
        Mockito.when(tradeService.searchTransaction()).thenReturn(new Data(transactions));
        producerTemplate.sendBody(transactions);
        mockQueue.expectedMessageCount(1);
        mockQueue.assertIsSatisfied(2000);
    }

Пожалуйста, исправьте меня, если яя делаю что-то не так!

0 голосов
/ 26 февраля 2019

Тестирование с использованием Apache Camel и Spring-Boot действительно просто.

Просто сделайте следующее (приведенный ниже пример является абстрактным примером, чтобы дать вам подсказку, как вы можете это сделать):

Напишите тестовый класс

Используйте Spring-Boot Annotations для настройки тестового класса.

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE)
@RunWith(SpringRunner.class)
public class MyRouteTest {
    @EndpointInject(uri = "{{sourceEndpoint}}")
    private ProducerTemplate sourceEndpoint;
    ....
    public void test() {
        // send your body to the endpoint. See other provided methods too.
        sourceEndpoint.sendBody([your input]);
    }
}

В src/test/application.properties: настройте конечные точки Camel, такие как источник и цель:

sourceEndpoint=direct:myTestSource

Подсказки:

Хорошо не привязывать начальную и конечную точки на маршруте напрямую при использовании весенней загрузки, а использовать application.properties.Таким образом, проще смоделировать конечные точки для модульных тестов, потому что вы можете перейти на direct -компонент без изменения исходного кода.

Это означает, что вместо: from("quartz2://tsTimer?cron=0/20+*+8-18+?+*+MON,TUE,WED,THU,FRI+*") вы должны написать: from("{{sourceEndpoint}}")

и настройте sourceEndpoint в своем application.properties: sourceEndpoint=quartz2://tsTimer?cron=0/20+*+8-18+?+*+MON,TUE,WED,THU,FRI+*

Таким образом, вы также можете использовать свой маршрут для различных ситуаций.

Документация

Хорошую документацию о том, как тестировать с помощью spring-boot, можно найти здесь: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html

Для Apache Camel: http://camel.apache.org/testing.html

...