После помощи экспертов из верблюжьего модульного теста с 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
.
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 {
}
Когда вы расширяете CamelTestSupport
, это НЕ пружинное приложение. Вам нужно продлить CamelSpringTestSupport
. Это создаст Camel во время выполнения Spring, а затем позволит bean-компонентам иметь IoC через Spring. Этот вид тестирования часто используется с маршрутами Camel XML, где маршруты определены в файлах XML. Однако вы можете иметь простой XML-файл и также ссылаться на маршруты в Java DSL.
Однако, как отвечает Макото, модульное тестирование vanilla Spring в последнее время часто связано с использованием всех этих аннотаций gazillion. Верблюд поддерживает это, как показывает его ответ. Так же, например, выполняется тестирование Spring Boot и т. Д.
Вы можете найти несколько модульных тестов в camel-test-spring
, которые также можно использовать в качестве вдохновения.
Похожие вопросы
Связанные вопросы
Новые вопросы
spring-boot
Spring Boot - это фреймворк, который позволяет легко создавать приложения и сервисы производственного уровня на основе Spring с минимальными усилиями. Он требует самоуверенного взгляда на платформу Spring, предназначенную для новых и опытных пользователей Spring.