Hello, I'm back with some code. The mock route builder: @Component public class MockedTransactionToDBPublisherRouteBuilder extends TransactionToDBPublisherRouteBuilder {
/** * @throws java.sql.SQLException */ public MockedTransactionToDBPublisherRouteBuilder(DataSource datasource, TransactionTemplate transactionTemplate, String redeliveryPolicy, ProducerTemplate producer, ConsumerTemplate consumer) { super(datasource, transactionTemplate, redeliveryPolicy, producer, consumer); } /** * {@inheritDoc} */ @Override protected String getExceptionEndpoint() { return "mock:exception"; } /** * {@inheritDoc} */ @Override protected String getDeadLetterEndpoint() { return "mock:deadletter"; } /** * {@inheritDoc} */ @Override protected String getInputEndpoint() { return "direct:input"; } /** * {@inheritDoc} */ @Override protected String getOutputEndpoint() { return "mock:output"; } } The route initialized in TransactionToDBPublisherRouteBuilder: protected void createRoute(Processor processor) { from(getInputEndpoint()) // when the exchange is a TRANSACTION and is completed update the number of passed transactions .onCompletion() .onCompleteOnly() .onWhen(TransactionPredicates.isMessageType(MessageType.TRANSACTION)) .process(endOfDaySyncProcessor) .end() // the onCompletion callback ended and normal processing is back .choice() // the End Of Day must be handled separately since it is processed after all the TRANSACTIONs .when(TransactionPredicates.isMessageType(MessageType.END_OF_DAY)) .process(endOfDaySyncProcessor) // let all the other exchanges follow the standard route // this path can't go through the endOfDaySync route because we need to intercept the callback .otherwise() .process(processor) .to(getOutputEndpoint()) .end(); // this is the route where the End Of Day go after all the transactions have been integrated from(getSyncEndOfDayEndpoint()) .process(processor) .to(getOutputEndpoint()); } The base test class: @ContextConfiguration(locations = { "transactionToDb-context.xml" }) abstract public class AbstractTransactionToDBPublisherRouteBuilderTest extends AbstractJUnit4SpringContextTests { protected static final String CHARSET = "UTF-8"; @Autowired protected CamelContext camelContext; @Autowired protected DataSource DATA_SOURCE; @Autowired protected TransactionTemplate TRANSACTION_TEMPLATE; @EndpointInject(uri = "mock:output") protected MockEndpoint resultEndpoint; @EndpointInject(uri = "mock:exception") protected MockEndpoint exceptionEndpoint; @Produce(uri = "direct:input") protected ProducerTemplate template; @BeforeClass public static void beforeClass() { // force jibx to use the staxReaderFactory System.setProperty("org.jibx.runtime.impl.parser", "org.jibx.runtime.impl.StAXReaderFactory"); } @Before public void setUp() throws Exception { // delete all records from the database TestUtil.clearDatabase(DATA_SOURCE.getConnection()); } protected Exchange createExchangeWithBodyAndHeader(Object body, MessageType type) { Exchange exchange = new DefaultExchange(camelContext); Message message = exchange.getIn(); message.setHeader("testClass", getClass().getName()); message.setHeader(MessageConstant.ERES_CONTENT_TYPE, type.toString()); message.setBody(body); return exchange; } } The test: @Test public void testRouteWithPendingTransactions() throws Exception { resultEndpoint.setExpectedMessageCount(4); // sending Transaction 1 InputStream is = getClass().getClassLoader().getResourceAsStream("Transaction1.xml"); String msg = TestUtil.getInputStreamAsString(is, CHARSET); is.close(); Exchange exchange = createExchangeWithBodyAndHeader(msg, MessageType.TRANSACTION); template.send(exchange); // sending Transaction 2 is = getClass().getClassLoader().getResourceAsStream("Transaction2.xml"); msg = TestUtil.getInputStreamAsString(is, CHARSET); is.close(); exchange = createExchangeWithBodyAndHeader(msg, MessageType.TRANSACTION); template.send(exchange); // sending End Of Process which must wait for 3 transactions to be processed is = getClass().getClassLoader().getResourceAsStream("endBusinessDate.xml"); msg = TestUtil.getInputStreamAsString(is, CHARSET); is.close(); // turn the End Of Day into Exchange and send them to the Direct Input exchange = createExchangeWithBodyAndHeader(msg, MessageType.END_OF_DAY); template.send(exchange); resultEndpoint.assertIsNotSatisfied(1000); // sending Transaction 3, which should trigger the processing of the End Of Process also is = getClass().getClassLoader().getResourceAsStream("Transaction3.xml"); msg = TestUtil.getInputStreamAsString(is, CHARSET); is.close(); exchange = createExchangeWithBodyAndHeader(msg, MessageType.TRANSACTION); template.send(exchange); // assert that we got all the messages resultEndpoint.assertIsSatisfied(1000); } The syncProcessor is working fine but none of the onCompletion events get to it. Thanks for your support. -- View this message in context: http://camel.465427.n5.nabble.com/onCompletion-not-triggerd-in-testing-tp5743163p5743249.html Sent from the Camel - Users mailing list archive at Nabble.com.