После помощи экспертов из верблюжьего модульного теста с cametestsupport, шаблон является always null, у меня возникла еще одна проблема. Ниже мой тестовый класс - простой тест, который проверяет маршрут, который имеет только POJO ValidationProcessor.

public class RouteTests extends CamelTestSupport {

    @Override
    protected RouteBuilder createRouteBuilder() {
        return new RouteBuilder() {
            @Override
            public void configure() {
                from("direct:start")
                        .filter().method(ValidationProcessor.class, "validate")
                        .to("mock:result");
            }
        };
    }

    @Test
    public void testSendMatchingMessage() throws Exception {
        ObjectMapper objectmapper = new ObjectMapper();
        ClassLoader loader = Thread.currentThread().getContextClassLoader();
        InputStream stream = loader.getResourceAsStream("test.json");
        JSONObject testJson = new JSONObject(objectmapper.readValue(stream, Map.class));

        MockEndpoint resultEndpoint = getMockEndpoint("mock:result");
        resultEndpoint.expectedMessageCount(1);
        template.sendBody("direct:start", testJson);
        resultEndpoint.assertIsSatisfied();
    }
}

Проблема возникает, когда в этом ValidationProcessor есть компонент @Autowired. Моему методу проверки нужны данные из Elasticsearch, поэтому у меня есть @Autowired для эластичного клиента. Когда я запускаю mvn clean test, я получаю NullPointerException о том, что этот эластичный клиент является нулевым. Я думаю, проблема в том, что этот тест не имеет ничего общего со Spring и, следовательно, с проблемой, но я не знаю, как это преодолеть. Мой тест должен получить данные из Elasticsearch, и, следовательно, POJO ValidationProcessor действительно нуждается в @Autowired.

0
ananth 14 Мар 2018 в 00:37

2 ответа

Лучший ответ

Я обнаружил, что неразумно расширять CamelTestSupport, когда вы хотите использовать что-либо с Spring. Фактически, есть лучший способ сделать это - использовать вместо этого CamelSpringBootRunner.

Ну ... я говорю "лучше". Вы обнаружите, что прикрепляете кучу аннотаций. Из вещей, которые вам понадобятся:

  • Усилитель, обеспечивающий правильную загрузку Camel
  • Маршруты, которые вы хотите добавить в путь к классам (и все компоненты); это гарантирует, что они будут добавлены в реестр Camel через реестр Spring.
  • Вы должны загрязнять контекст после каждого запуска, иначе ваши тесты переходят в нестабильное состояние.
  • Вы можете автоматизировать конечные точки, указав @MockEndpoints или @MockEndpointsAndSkip. Первый отправляет данные по фактическому маршруту.

Ниже только начало. Многие из этих аннотаций и документацию к ним можно найти в официальной документации.

@RunWith(CamelSpringBootRunner.class)
@BootstrapWith(SpringBootTestContextBootstrapper.class)
@ActiveProfiles("test")
@SpringBootTest(classes = { YourEntryPointClass.class })
@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)
@UseAdviceWith
@MockEndpoints("direct:*")
public class RouteTests {

}
2
Makoto 13 Мар 2018 в 21:58

Когда вы расширяете CamelTestSupport, это НЕ пружинное приложение. Вам нужно продлить CamelSpringTestSupport. Это создаст Camel во время выполнения Spring, а затем позволит bean-компонентам иметь IoC через Spring. Этот вид тестирования часто используется с маршрутами Camel XML, где маршруты определены в файлах XML. Однако вы можете иметь простой XML-файл и также ссылаться на маршруты в Java DSL.

Однако, как отвечает Макото, модульное тестирование vanilla Spring в последнее время часто связано с использованием всех этих аннотаций gazillion. Верблюд поддерживает это, как показывает его ответ. Так же, например, выполняется тестирование Spring Boot и т. Д.

Вы можете найти несколько модульных тестов в camel-test-spring, которые также можно использовать в качестве вдохновения.

2
Claus Ibsen 14 Мар 2018 в 06:57