Как проверить этот верблюжий маршрут?Инъекция зависимости и переменные среды - PullRequest
0 голосов
/ 16 июня 2019

У меня есть два сомнения:

a.Как смоделировать http4-компонент таким образом, чтобы мой маршрут не знал, когда он будет смоделирован и когда он реален?

b.Как инициализировать myDestinationEndpoint при запуске тестов?

package my.package

@Component
public class MyRoute extends RouteBuilder {
    @Value("${MY_DESTINATION_ENDPOINT}")
    private String myDestinationEndpoint;

    from("direct:my-route")
        .split()
            .method(MyBean.class,"split") //splits the message in two messages. One will pass and other will be redirect to http4
            .aggregationStrategy(MyBean.aggregator()) //After redirect to http4, the response will be added to the first message and continue to the next route.
                .choice()
                    .when().method(MyBean.class,"shouldRedirect")
                        .to("http4:" + myDestinationEndpoint + "?bridgeEndpoint=true") //How to mock here???
                        .unmarshal(new JacksonDataFormat(Object.class))
                 .end()
            .end()
    ;
}

Что пробовали?

a.Для того, чтобы издеваться, я нашел компонент «макет».Но в этом случае мне сложно кодировать макет на маршруте.Мне кажется, что у меня есть один тестовый код с макетом для запуска в тестовой среде и другой подобный код без макета для запуска в производстве.Но, насколько я понимаю, тестовый код должен быть тем же самым рабочим кодом.

.when().method(MyBean.class,"shouldRedirect")
    .to("mock:" + myDestinationEndpoint)

Я ожидал, что макет работал как интерфейс, и в производстве я должен внедрить реальный объект, а в тесте я должен внедритьподдельный / фиктивный объект.

b.Как я застрял на шаге а.У меня не так много времени, чтобы исследовать это.Запустив em localhost, я установил myDestinationEndpoint в качестве аргумента Java-программы в eclipse.При запуске em QA и PRD я использую файл configmap (.yml).

РЕДАКТИРОВАТЬ: пытаясь реализовать предложение ShellDragon.

Я реализовал этот тестовый класс, и я получил эту ошибку:

org.springframework.context.ApplicationContextException: Unable to start embedded container; nested exception is org.springframework.context.ApplicationContextException: Unable to start EmbeddedWebApplicationContext due to missing EmbeddedServletContainerFactory bean.

Я добавил файл FirstTest.properties в / src / test / resources и / src / test / resources / my / package

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@ContextConfiguration(classes = AgenciaInternalRoute.class) //Classe que contém valores a serem injetados
@TestPropertySource //flag que faz com que a classe indicada em @ContextConfiguration receba os valores de um arquivo de propriedades
public class FirstTest extends CamelTestSupport {

    @Autowired
    private TestRestTemplate restTemplate;


    @Override
    protected RouteBuilder createRouteBuilder() throws Exception{
        return new MyRoute();
    }

    @Test
    public void simpleTest() {

    }
}

1 Ответ

3 голосов
/ 17 июня 2019

Вы можете использовать adviseWith для перехвата обменных доставок в конечную точку http4 и перенаправления ее в конечную точку mock: во время выполнения теста. Оригинальный код может оставаться именно таким, как есть. Пожалуйста, посмотрите на тестовый пример здесь . Если вы используете Camel 3.x, API изменился, см. этот тестовый пример .

Чтобы смоделировать аннотацию @Value, используйте аннотацию TestPropertySource в Spring и запустите свой тестовый класс с подходящим бегуном, например SpringJUnit4ClassRunner. Никакого дополнительного взлома из командной строки не потребуется, если вы используете TestPropertySource

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...