Как протестировать маршрут с бобом, который будет обращаться к БД? - PullRequest
5 голосов
/ 19 января 2012

Здесь БД является лишь примером.Это означает, что что-то не может быть подготовлено в среде модульного тестирования.

Рассмотрим маршрут ниже:

DBBean dbBean = new DBBean();
from("direct:test").bean(dbBean).to("direct:someOtherLogic");

Когда проводится модульное тестирование, есть ли какой-нибудь подход к насмешке над dbBean?В модульном тесте трудно настроить настоящую БД.

Спасибо за вашу помощь.

Ответы [ 3 ]

3 голосов
/ 19 января 2012

Верблюд имеет тестовый набор, который позволяет вам манипулировать маршрутом перед тестированием.Тогда вы можете оставить маршрут нетронутым, а затем заменить части маршрута, и еще много чего.Это немного сложнее и задокументировано здесь как функция с рекомендациями: http://camel.apache.org/advicewith.html

Как правило, это работает проще, если EIP имеют назначенные идентификаторы, так как вы можете ссылаться на эти идентификаторы и заменять их чем-тоelse.

Однако, если вы знаете, что хотите заменить первое BeanDefinition, которое вы можете сделать:

weaveByType(BeanDefinition.class).selectFirst().replace().to("mock:dbBean");

См. ссылки выше, как использовать это с советом в Тесте верблюда.Комплект (например, верблюжий тест) JAR.

Имейте в виду, что рекомендуется сообщить верблюжьему тестовому комплекту, что вы используете совет, который вы делаете, как описано в нижней части этой ссылки.

2 голосов
/ 19 января 2012

вы можете использовать встроенную базу данных (DERBY и т. Д.) ... вот пример, взятый из модульного теста camel-jdbc

<camelContext id="camel" xmlns="http://camel.apache.org/schema/spring">
    <route>
        <from uri="timer://kickoff?period=10000"/>
        <setBody>
           <constant>select * from customer</constant>
        </setBody>
        <to uri="jdbc:testdb"/>
        <to uri="mock:result"/>
    </route>
 </camelContext>

  <!-- Just add a demo to show how to bind a date source for camel in Spring-->
  <jdbc:embedded-database id="testdb" type="DERBY">
      <jdbc:script location="classpath:sql/init.sql"/>
  </jdbc:embedded-database>

В противном случае вы можете попытаться использовать DBUnit (для настройки тестовой базы данных) или Mockito (для проверки ответа на вызов БД)

1 голос
/ 19 января 2012

Если ваш DbBean является интерфейсом, то вы можете иметь 2 разных реализации. Один для реальной работы БД. И другое для блочных тестов, где вы моделируете БД.

Тогда это просто вопрос создания макета в модульном тесте

DbBean db = new MockDbBean()

Как простой Java-код. Вы можете иметь метод получения / установки в вашем классе RouteBuilder

public class MyRouteBuilder extends RouteBuilder {
    private DbBean dbBean;

    // getter/setter for dbBean

   public void configure() throws Exception {
      from("direct:test").bean(dbBean).to("direct:someOtherLogic");
   }
}

Затем из модульного теста достаточно установить MockDbBean с помощью установщика на экземпляре MyRouteBuilder.

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