2011-12-20 12 views
16

Tengo una serie de componentes "interconectados" que se comunican a través de las colas de mensajes de ActiveMQ. Cada componente usa Camel para tratar cada una de estas colas como un Endpoint. Cada componente utiliza el mismo patrón básico:Prueba Camel con MockEndpoints

Basic component pattern

donde cada componente consume mensajes fuera de una cola de entrada, procesa el mensaje (s), y luego coloca 1+ mensajes en una cola de salida/salida. La cola de "salida" se convierte en la cola de "entrada" para el siguiente componente de la cadena. Bastante básico.

Ahora estoy tratando de arremangarme las mangas y proporcionar pruebas unitarias para cada componente utilizando el MockEndpoints proporcionado por la API de prueba de Camel. He estado vertiendo sobre los javadocs y los pocos ejemplos en el sitio web de Camel, pero tengo dificultades para conectar todos los puntos.

Me parece que, para cada componente, una parte de mi unidad de pruebas va a querer llevar a cabo las siguientes tres cosas:

  • prueba para ver si hay mensajes en espera en un determinado "de entrada "cola de
  • Tire esos mensajes hacia abajo y procesarlas
  • impulso nuevos mensajes a una 'cola de salida' y verificar que lo hicieron no

que ser Lieve Necesito crear MockEndpoints para cada cola de este modo:

@EndpointInject(uri = "mock:inputQueue") 
protected MockEndpoint intputQueue; 

@EndpointInject(uri = "mock:outputQueue") 
protected MockEndpoint outputQueue; 

Así que ahora, en mis métodos de prueba JUnit, puedo configurar las expectativas e interactuar con estos criterios de valoración:

@Test 
public final void processMethodShouldSendToOutputQueue() 
{ 
    Component comp = new Component(); 
    comp.process(); 

    outputQueue.assertIsSatisfied(); 
} 

estoy simplemente no entender cómo cablear todo correctamente:

  • ¿Cómo conecto comp a la inputQueue y outputQueue MockEndpoints?
  • Para cada MockEndpoint, ¿cómo configuro las expectativas para que assertIsSatisfied() verifique que un mensaje esté presente dentro de una cola en particular, o que una cola en particular contenga mensajes?
+0

http: // stackoverflow. com/questions/5664331/how-to-unit-test-production-routes-in-apache-camel –

Respuesta

11

Adam, hay varias formas de hacerlo.

Para componentes POJO, blackbox pruébelos por separado de cualquier contexto/enrutamiento Camel para centrarse en la lógica comercial.

Si desea realizar pruebas de extremo a extremo de las rutas, considere utilizar uno de estos enfoques para validar que cada paso de la ruta se cumpla.

  • uso NotifyBuilder para construir expresiones de validación de cambio (un tanto complejos para conseguir su cabeza alrededor)
  • uso AdviceWith para cambiar dinámicamente la ruta antes de su ejecución (añadir log/puntos finales Mock, etc.)

Prefiero AdviceWith porque es muy flexible y aprovecha los conocidos MockEndpoints. Para un ejemplo completo de este tema, consulte this unit test

En resumen, se creará una unidad de prueba para inyectar MockEndpoints en su ruta y luego validar contra ellos como de costumbre ...

context.getRouteDefinition("myRouteId").adviceWith(context, new AdviceWithRouteBuilder() { 
    @Override 
    public void configure() throws Exception { 
     // mock all endpoints 
     mockEndpoints(); 
    } 
}); 

getMockEndpoint("mock:direct:start").expectedBodiesReceived("Hello World"); 

template.sendBody("direct:start", "Hello World"); 
+0

Agradezco la respuesta del día de hoy, y sí voy a probar los componentes por separado (y sus métodos de "proceso"). Sin embargo, como parte de una especie de "prueba de integración" entre los componentes y sus colas de entrada/salida, quiero automatizar la verificación de los mensajes moviendo rutas definidas largas. El API de AdviceWith parece interesante y lo verificaré. Pero su existencia parece anular la necesidad de un MockEndpoint. ¿Puedes aclarar cuándo es apropiado usar cada uno? ¡Y gracias de nuevo! – IAmYourFaja

+0

Adam, para pruebas verdaderas de extremo a extremo, utilice AdviceWith para inyectar MockEndpoints dinámicamente en sus rutas de producción existentes. Mock es muy potente debido a las API de estadísticas/aserción que se proporcionan, pero NO se debe agregar a las rutas de producción directamente. Actualizaré mi respuesta con un ejemplo de cómo hacer esto ... –

+0

@boday, ¿pueden completar el ejemplo que muestra cómo enviar un 'Intercambio 'a la ruta? Lo pregunto porque no me queda claro cómo puedes enviar un 'Intercambio 'al' de' de la ruta. Gracias por adelantado. – danidemi