Интеграционный тест Apache Camel - NotifyBuilder - PullRequest
3 голосов
/ 11 ноября 2010

Я пишу интеграционные тесты для проверки существующих маршрутов. Рекомендуемый способ получения ответа выглядит примерно так (через Camel In Action раздел 6.4.1):

public class TestGetClaim extends CamelTestSupport {

    @Produce(uri = "seda:getClaimListStart")
    protected ProducerTemplate producer;

    @Test
    public void testNormalClient() {
        NotifyBuilder notify = new NotifyBuilder(context).whenDone(1).create();

        producer.sendBody(new ClientRequestBean("TESTCLIENT", "Y", "A"));
        boolean matches = notify.matches(5, TimeUnit.SECONDS);
        assertTrue(matches);

        BrowsableEndpoint be = context.getEndpoint("seda:getClaimListResponse", BrowsableEndpoint.class);
        List<Exchange> list = be.getExchanges();
        assertEquals(1, list.size());
        System.out.println("***RESPONSE is type "+list.get(0).getIn().getBody().getClass().getName());
    }
}

Тест запускается, но я ничего не получаю обратно. Сбой assertTrue(matches) после 5-секундного тайм-аута.

Если я перепишу тест, чтобы он выглядел так, я получу ответ:

@Test
public void testNormalClient() {
    producer.sendBody(new ClientRequestBean("TESTCLIENT", "Y", "A"));
    Object resp = context.createConsumerTemplate().receiveBody("seda:getClaimListResponse");
    System.out.println("***RESPONSE is type "+resp.getClass().getName());
}

В документации немного об этом сказано, поэтому кто-нибудь может сказать мне, что я делаю не так с первым подходом? Есть ли что-то плохое в том, чтобы следовать второму подходу?

Спасибо.

UPDATE Я разбил это, и похоже, что проблема в том, что seda используется в качестве начальной конечной точки в сочетании с использованием receientList в маршруте. Я также изменил конструкцию NotifyBuilder (у меня была указана неверная конечная точка).

  • Если я изменю начальную конечную точку на direct вместо seda , тогда тест будет работать; или
  • Если я закомментирую receientList тогда тест будет работать.

Вот урезанная версия моего маршрута, которая воспроизводит эту проблему:

public class TestRouteBuilder extends RouteBuilder {

    @Override
    public void configure() throws Exception {
//      from("direct:start")    //works
        from("seda:start")  //doesn't work
        .recipientList(simple("exec:GetClaimList.bat?useStderrOnEmptyStdout=true&args=${body.client}"))
        .to("seda:finish");
    }

}

Обратите внимание, что если я изменю исходный код NotifyTest из источника " Camel In Action " на построитель маршрутов, подобный этому, то он также завершится неудачей.

Ответы [ 2 ]

2 голосов
/ 11 ноября 2010

Попробуйте использовать «seda: getClaimListResponse» в getEndpoint, чтобы убедиться, что конечная точка uri на 100% правильна

0 голосов
/ 26 июля 2013

FWIW: Похоже, что notifyBuilder в сочетании с очередями seda не совсем работают: тестовый класс для иллюстрации:

public class NotifyBuilderTest extends CamelTestSupport {

// Try these out!
// String inputURI = "seda:foo";   // Fails
// String inputURI = "direct:foo"; // Passes

@Test
public void testNotifyBuilder() {

    NotifyBuilder b = new NotifyBuilder(context).from(inputURI)
            .whenExactlyCompleted(1).create();

    assertFalse( b.matches() );
    template.sendBody(inputURI, "Test");
    assertTrue( b.matches() );

    b.reset();

    assertFalse( b.matches() );
    template.sendBody(inputURI, "Test2");
    assertTrue( b.matches() );
}

@Override
protected RouteBuilder createRouteBuilder() throws Exception {
    return new RouteBuilder() {
        @Override
        public void configure() throws Exception {
            from(inputURI).to("mock:foo");
        }
    };
}
}
...