java unit-testing messaging apache-camel

java - Prueba de camello con MockEndpoints



unit-testing messaging (1)

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

Cuando cada componente consume mensajes fuera de una cola de entrada, procesa los mensajes y luego coloca los mensajes 1+ 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 enrollar mis mangas y proporcionar pruebas de unidad para cada componente utilizando los MockEndpoints proporcionados por la prueba de API de Camel. He estado revisando 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 mis pruebas de unidad querrá lograr las siguientes tres cosas:

  • Probar para ver si hay mensajes esperando en una cola de "entrada" particular
  • Tira esos mensajes y procesalos
  • Empuje los mensajes nuevos a una cola de "salida" y verifique que llegaron allí

Creo que necesito crear MockEndpoints para cada cola así:

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

Así que ahora, en mis métodos de prueba de JUnit, puedo establecer expectativas e interactuar con estos puntos finales:

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

No entiendo cómo cablear todo correctamente:

  • ¿Cómo conecto comp a 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?

Adam, hay varias maneras de hacer esto.

Para los componentes de POJO , Blackbox los prueba por separado de cualquier contexto / enrutamiento de Camel para centrarse en la lógica empresarial.

Si desea realizar pruebas de extremo a extremo de las rutas, considere usar uno de estos métodos para validar que cada paso en la ruta esté satisfecho.

  • use NotifyBuilder para crear expresiones de validación de Exchange (algo complejo para entenderlo)
  • use AdviceWith para cambiar dinámicamente la ruta antes de su ejecución (agregar puntos finales Log / Mock, etc.)

Prefiero AdviceWith porque es muy flexible y aprovecha los MockEndpoints familiares. Para un ejemplo completo de esto, vea esta prueba de unidad.

En resumen, creará una prueba de unidad para inyectar MockEndpoints en su ruta y luego la validará 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");