Весеннее тестирование маршрутизатора на основе контента Camel

У меня есть следующий весенний маршрут:

 <camelContext xmlns="http://camel.apache.org/schema/spring">
        <route>
            <from uri="activemq:topic:inbox" />
            <choice>
                <when>
                    <simple>${in.header.Value}</simple>
                    <log message="Cc: ${in.header.Value}" />
                </when>
            </choice>
            <to uri="mock:result" />
        </route>
 </camelContext>

У меня есть требование использовать Spring Testing (CamelSpringJUnit4ClassRunner), хотя я нашел простые для понимания примеры того, как проверить условие с помощью Java DSL. Мой тестовый класс выглядит так:

@RunWith(CamelSpringJUnit4ClassRunner.class)
@BootstrapWith(CamelTestContextBootstrapper.class)
@ContextConfiguration(locations = "file:src/main/resources/META-INF/spring/camel-context-activemq-embedded.xml")
@DirtiesContext(classMode = ClassMode.AFTER_EACH_TEST_METHOD)
@MockEndpoints("log:*")
@DisableJmx(false)

public class MyTest{

    private Logger LOG = LogManager.getLogger(MyTest.class.getName());

    protected Exchange exchange;
    protected CustomComponent customComponent= new CustomComponent();

    @Produce(uri = "activemq:topic:inbox")
    protected ProducerTemplate template;

    @EndpointInject(uri = "mock:result")
    protected MockEndpoint resultEndpoint;

@Test
    public void tes1() throws InterruptedException {
        String headerValue= MyComponent.Value;
        EmailAddress recipients = new EmailAddress("recipient@example.com");
        template.sendBodyAndHeader("activemq:topic:inbox", recipients.toString(), headerValue);
        resultEndpoint.expectedBodiesReceived(headerValue);
        resultEndpoint.expectedHeaderReceived("header value", headerValue);
        resultEndpoint.expectedMessageCount(1);
    }

Я изо всех сил пытаюсь понять, как проверить фактическое состояние, продиктованное ЦБ РФ, но, что более важно, я сомневаюсь, является ли это даже правильным способом проверки. MyComponent.VALUEConstant - это свойство, указанное в моем пользовательском компоненте, и вышеприведенный тест фактически проходит. Однако, если я создаю экземпляр headerValue с другим свойством в моем компоненте и, следовательно, условие, как предполагается, не выполняется, тест проходит. Можете ли вы помочь?

Спасибо,

я

1 ответ

Решение

Ну, первое, что я вижу, это то, что вашему простому выражению не хватает сравнения - вероятно, оно должно быть ${in.header.value} == 'wanted value',

Что касается тестирования, то это действительно зависит от типа теста. Здесь вы проводите интеграционное тестирование, поэтому я бы проверил, что эффекты ожидаемые - БД изменилась так, как должна и т. Д. Но, поскольку ваш маршрут выполняет только некоторые записи, я бы изменил:

<log message="Cc: ${in.header.Value}" />

в

<log message="Cc: ${in.header.Value}" />
<to uri="mock:choice-triggered" />

а затем убедитесь, что mock:choice-triggered конечная точка получила сообщение (или не получила, в зависимости от сценария). Но при тестировании реального маршрута вы, вероятно, захотите убедиться, что некоторые данные были вставлены в БД или какое-то сообщение опубликовано в MQ или что электронное письмо было отправлено.

Что касается вашей константы, я бы посоветовал вам использовать внешние свойства - и Camel, и Spring имеют отличную поддержку заполнителей свойств, я предлагаю вам попробовать.

Другие вопросы по тегам