Тестирование верблюжьих маршрутов - PullRequest
0 голосов
/ 20 января 2020

У меня есть несколько классов маршрутов, определенных в моем проекте в com.comp.myapp.routes. Для проверки их я проверяю конечный маршрут и проверяю / сравниваю полученную доставку.

Скажем, например, у меня есть следующие маршруты:

public class MyRoute1 extends RouteBuilder {
    public void configure() throws Exception {
       //Route_1 code
    }
}

public class MyRoute2 extends RouteBuilder {
    public void configure() throws Exception {
       //Route_2 code
    }
}

....
...//some route impl
..
public class MyRouteN extends RouteBuilder {
    public void configure() throws Exception {
       //Route_N code
    }
}

Теперь для всех этих маршрутов тестовый пример, который я написал кажется таким же. Сначала смейся.

Макет для MyRoute1 :

public class MyRoute1_Mock extends RouteBuilder {
    public void configure() throws Exception {
      from("direct:sampleInput")
                .log("Received Message is ${body} and Headers are ${headers}")
                .to("mock:output");
    }
}

Тест для MyRoute1:

public class MyRoute1_Test extends CamelTestSupport {
    @Override
    public RoutesBuilder createRouteBuilder() throws Exception {
        return new MyRoute1_Mock();
    }
    @Test
    public void sampleMockTest() throws InterruptedException {
        String expected="Hello";
        /**
         * Producer Template.
         */
        MockEndpoint mock = getMockEndpoint("mock:output");
        mock.expectedBodiesReceived(expected);
        String input="Hello";
        template.sendBody("direct:sampleInput",input );
        assertMockEndpointsSatisfied();
    }
}

Сейчас сделать модульный тест для других классов, просто скопируйте и вставьте приведенный выше код с другим именем, скажем, MyRoute2_Test, MyRoute3_Test, ... MyRouteN_Test.

Так что же он на самом деле тестировал? Это просто написано с целью написания тестового примера. Это на самом деле просто проверяет / проверяет, работает ли фиктивная библиотека и библиотека верблюжьих тестов. Не работает наш код или нет? Как это на самом деле должно быть сделано?

Ответы [ 3 ]

0 голосов
/ 21 января 2020

Вы хотите проверить свои верблюжьи маршруты, но в тесте вы издеваетесь над ними . Так что да, вы тестируете свой маршрут вместо реального маршрута.

Чтобы проверить свои реальные маршруты:

  • Отправьте сообщение на ваши реальные маршруты from конечная точка
  • Если это не легко, смоделируйте вашу from конечную точку (не весь маршрут!), Заменив ее конечной точкой direct. Это очень просто с adviceWith
  • Тестовое сообщение проходит через ваш маршрут
  • Утверждение, что любая конечная точка to получает правильное сообщение от издеваться над этими конечными точками тоже. Опять же, используйте advice с для этого. И Camel Mock конечно
  • Вы можете получить полученные сообщения (обмены) от Camel Mock , чтобы сделать подробные утверждения
  • Если вы получили счастливый тест, начните писать отрицательные тесты, вводя ошибки в свой маршрут. adviceWith может помочь и здесь
  • ... и т. Д.

Если вы совсем не знакомы с тестами на маршруте Camel, получите Camel в действии 2-й издание . Объясняет все упомянутые аспекты тестирования для приложений Camel на 65 страницах. И, конечно же, вам понадобится совершить полное путешествие по вселенной Camel на гораздо большем количестве страниц.

Кстати: если тестировать ваши маршруты сложно , они слишком сложные. Начните делить ваши маршруты так, чтобы они были легко тестируемыми.

0 голосов
/ 22 января 2020

Объяснено в строке, Надеюсь, что это поможет вам понять значение Mock в модульном тесте:

 public void sampleMockTest() throws InterruptedException {
    String expected="Hello"; 
    MockEndpoint mock = getMockEndpoint("mock:output");//Mocking endpoint
    mock.expectedBodiesReceived(expected); //Setting expected output to mocked endpoint
    String input="Hello";
    template.sendBody("direct:sampleInput",input );//triggering route execution by sending input to route
    assertMockEndpointsSatisfied(); //Verifies if input is equal to output
}

Если вашей конечной точкой является служба отдыха, вы можете использовать "TestRestTemplate" вместо Mocking it и Test like ниже:

import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class SampleCamelApplicationTest {
}
import org.springframework.boot.test.web.client.TestRestTemplate;

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class SampleCamelApplicationTest {
   @Autowired
   private TestRestTemplate restTemplate;
}
@Test
public void sayHelloTest() {
   // Call the REST API
   ResponseEntity<String> response = restTemplate.getForEntity("/camel/hello", String.class);
   assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
   String s = response.getBody();
   assertThat(s.equals("Hello World"));
}
0 голосов
/ 21 января 2020

Маршрут, который вы показываете, на самом деле ничего не делает с сообщениями, проходящими через него, поэтому проверка того, что тот же текст, который вы отправили с одного конца, выходит с другого, - это все, что нужно проверить.

Для маршрутов с больше преобразования и обработки данных, вы можете проверить выходные типы данных, чтобы процессоры вызывались при необходимости, вы могли бы посмеяться над созданием исключений и т. д. c. То, что у вас есть, - хорошее начало для этого.

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