@Test public void testWithRepublishRecovererDefaultExchangeAndRouting() throws Throwable { AmqpTemplate amqpTemplate = mock(AmqpTemplate.class); RetryOperationsInterceptor interceptor = RetryInterceptorBuilder.stateless() .recoverer(new RepublishMessageRecoverer(amqpTemplate) { @Override protected Map<? extends String, ? extends Object> additionalHeaders(Message message, Throwable cause) { return Collections.singletonMap("fooHeader", "barValue"); } }) .build(); final AtomicInteger count = new AtomicInteger(); Foo delegate = createDelegate(interceptor, count); Message message = MessageBuilder .withBody("".getBytes()) .setReceivedExchange("exch") .setReceivedRoutingKey("foo") .build(); delegate.onMessage("", message); assertEquals(3, count.get()); verify(amqpTemplate).send("error.foo", message); assertNotNull(message.getMessageProperties().getHeaders() .get(RepublishMessageRecoverer.X_EXCEPTION_STACKTRACE)); assertNotNull(message.getMessageProperties().getHeaders().get(RepublishMessageRecoverer.X_EXCEPTION_MESSAGE)); assertNotNull(message.getMessageProperties().getHeaders().get(RepublishMessageRecoverer.X_ORIGINAL_EXCHANGE)); assertNotNull(message.getMessageProperties().getHeaders() .get(RepublishMessageRecoverer.X_ORIGINAL_ROUTING_KEY)); assertEquals("barValue", message.getMessageProperties().getHeaders().get("fooHeader")); }