2012-01-19 10 views
5

Aquí DB es solo un ejemplo. Significa que algo no se puede preparar en el entorno de prueba de la unidad.¿Cómo probar la unidad de una ruta con un bean que accederá a DB?

Considerar la ruta a continuación:

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

Al hacer prueba de unidad, ¿hay algún método para burlarse del 'dbBean'? En la prueba de unidad, es difícil configurar una base de datos real.

Gracias por su ayuda.

Respuesta

3

Camel tiene un kit de prueba, que le permite manipular la ruta antes de realizar la prueba. Luego puede mantener la ruta intacta y luego reemplazar partes de la ruta y otras cosas. Es un poco elaborado, y está documentado como el consejo: con funcionalidad aquí: http://camel.apache.org/advicewith.html

Por lo general, es más fácil si los EIP tienen identificadores asignados, ya que puede hacer referencia a esos identificadores y reemplazarlos por otra cosa.

Sin embargo, si usted sabe que desea reemplazar el primer BeanDefinition que puede hacer:

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

Ver enlace de arriba cómo utilizar esto con el consejo, con el kit de prueba de camello (por ejemplo camello-test) JAR.

Tenga en cuenta que se recomienda indicarle a Camel Test Kit que está utilizando consejos, lo cual puede hacer como se documenta en la parte inferior de ese enlace.

1

puede utilizar una base de datos integrada (Derby, etc) ... aquí es un ejemplo tomado de un camel-jdbc unit test

<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> 

De lo contrario, puede intentar utilizar DBUnit (a la base de datos de prueba de configuración) o Mockito (a simula la respuesta de una llamada a DB)

+1

Buena solución para la prueba de unidad DB. Sin embargo, para algunos otros frijoles, puede ser difícil simular el ambiente. Creo que burlarse del frijol es un mejor enfoque. – Javen

+0

sí, lo entiendo completamente ... Mockito es increíble si puedes lograr que juegue bien con tu configuración ... de lo contrario, Claus sugirió otros enfoques (consejos, etc.) que funcionarían también ... buena suerte –

1

Si su DbBean es una interfaz, entonces puede tener 2 implementaciones diferentes. Uno para el verdadero trabajo DB. Y otro para las pruebas unitarias burladas, donde se simula el DB.

Entonces es sólo una cuestión de crear instancias de una maqueta en su unidad de prueba

DbBean db = new MockDbBean() 

Como su propio código Java simplemente. Puede tener un captador/definidor de su clase 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"); 
    } 
} 

Luego de una unidad de prueba es sólo una cuestión de establecer la MockDbBean usando un regulador de MyRouteBuilder ejemplo.

+0

Entonces Creo que la clave es exponer el frijol hacia el exterior. Cuando realice la prueba unitaria, configure el bean simulado en la ruta probada. Pero, ¿hay alguna forma de obtener el bean directamente del contexto de camello y reemplazarlo por un bean falso? De esta forma, no es necesario modificar la ruta actual y no se necesitan más campos y getter/setter. – Javen

Cuestiones relacionadas