public void processAndReply(MessagingMessageListenerAdapter listener, org.springframework.amqp.core.Message message, String expectedExchange, String routingKey, boolean mandatory, String expectedCorrelationId) throws Exception { Channel channel = mock(Channel.class); listener.onMessage(message, channel); ArgumentCaptor<AMQP.BasicProperties> argument = ArgumentCaptor.forClass(AMQP.BasicProperties.class); verify(channel).basicPublish(eq(expectedExchange), eq(routingKey), eq(mandatory), argument.capture(), aryEq(message.getBody())); assertEquals("Wrong correlationId in reply", expectedCorrelationId, argument.getValue().getCorrelationId()); }
@Test public void resolveConvertedPayload() throws Exception { MessagingMessageListenerAdapter listener = createDefaultInstance(Integer.class); Channel channel = mock(Channel.class); listener.onMessage(MessageTestUtils.createTextMessage("33"), channel); assertDefaultListenerMethodInvocation(); }
@Test public void resolveGenericMessage() throws Exception { MessagingMessageListenerAdapter listener = createDefaultInstance(Message.class); Channel channel = mock(Channel.class); listener.onMessage(MessageTestUtils.createTextMessage("test"), channel); assertDefaultListenerMethodInvocation(); }
@Test public void resolveMessageAndSession() throws Exception { MessagingMessageListenerAdapter listener = createDefaultInstance( org.springframework.amqp.core.Message.class, Channel.class); Channel channel = mock(Channel.class); listener.onMessage(MessageTestUtils.createTextMessage("test"), channel); assertDefaultListenerMethodInvocation(); }
@Test public void invalidMessagePayloadType() throws Exception { MessagingMessageListenerAdapter listener = createDefaultInstance(Message.class); Channel channel = mock(Channel.class); thrown.expect(ListenerExecutionFailedException.class); thrown.expectCause(Matchers.<Throwable>either(Matchers.instanceOf(MethodArgumentTypeMismatchException.class)) .or(Matchers.instanceOf(org.springframework.messaging.converter.MessageConversionException.class))); listener.onMessage(MessageTestUtils.createTextMessage("test"), channel); // Message<String> as Message<Integer> }
@Test public void exceptionInInvocation() { org.springframework.amqp.core.Message message = MessageTestUtils.createTextMessage("foo"); Channel channel = mock(Channel.class); MessagingMessageListenerAdapter listener = getSimpleInstance("wrongParam", Integer.class); try { listener.onMessage(message, channel); fail("Should have thrown an exception"); } catch (ListenerExecutionFailedException ex) { assertEquals(org.springframework.messaging.converter.MessageConversionException.class, ex.getCause().getClass()); } catch (Exception ex) { fail("Should not have thrown an " + ex.getClass().getSimpleName()); } }
@Test public void exceptionInListener() { org.springframework.amqp.core.Message message = MessageTestUtils.createTextMessage("foo"); Channel channel = mock(Channel.class); MessagingMessageListenerAdapter listener = getSimpleInstance("fail", String.class); try { listener.onMessage(message, channel); fail("Should have thrown an exception"); } catch (ListenerExecutionFailedException ex) { assertEquals(IllegalArgumentException.class, ex.getCause().getClass()); assertEquals("Expected test exception", ex.getCause().getMessage()); } catch (Exception ex) { fail("Should not have thrown an " + ex.getClass().getSimpleName()); } }
@Test public void exceptionInListenerBadReturnExceptionSetting() { org.springframework.amqp.core.Message message = MessageTestUtils.createTextMessage("foo"); Channel channel = mock(Channel.class); MessagingMessageListenerAdapter listener = getSimpleInstance("fail", true, String.class); try { listener.onMessage(message, channel); fail("Should have thrown an exception"); } catch (ListenerExecutionFailedException ex) { assertEquals(IllegalArgumentException.class, ex.getCause().getClass()); assertEquals("Expected test exception", ex.getCause().getMessage()); } catch (Exception ex) { fail("Should not have thrown an " + ex.getClass().getSimpleName()); } }
@Test public void genericMessageTest3() throws Exception { org.springframework.amqp.core.Message message = MessageTestUtils.createTextMessage("{ \"foo\" : \"bar\" }"); Channel channel = mock(Channel.class); MessagingMessageListenerAdapter listener = getSimpleInstance("withNonGenericMessage", Message.class); listener.setMessageConverter(new Jackson2JsonMessageConverter()); message.getMessageProperties().setContentType("application/json"); listener.onMessage(message, channel); assertEquals(LinkedHashMap.class, this.sample.payload.getClass()); }
@Test public void genericMessageTest1() throws Exception { org.springframework.amqp.core.Message message = MessageTestUtils.createTextMessage("\"foo\""); Channel channel = mock(Channel.class); MessagingMessageListenerAdapter listener = getSimpleInstance("withGenericMessageAnyType", Message.class); listener.setMessageConverter(new Jackson2JsonMessageConverter()); message.getMessageProperties().setContentType("application/json"); listener.onMessage(message, channel); assertEquals(String.class, this.sample.payload.getClass()); message = org.springframework.amqp.core.MessageBuilder .withBody("{ \"foo\" : \"bar\" }".getBytes()) .andProperties(message.getMessageProperties()) .build(); listener.onMessage(message, channel); assertEquals(LinkedHashMap.class, this.sample.payload.getClass()); }
@Test public void resolveCustomHeaderNameAndPayload() throws Exception { MessagingMessageListenerAdapter listener = createDefaultInstance(String.class, int.class); Channel channel = mock(Channel.class); MessageProperties properties = new MessageProperties(); properties.setHeader("myCounter", 24); org.springframework.amqp.core.Message message = MessageTestUtils.createTextMessage("my payload", properties); listener.onMessage(message, channel); assertDefaultListenerMethodInvocation(); }
@Test public void genericMessageTest2() throws Exception { org.springframework.amqp.core.Message message = MessageTestUtils.createTextMessage("{ \"foo\" : \"bar\" }"); Channel channel = mock(Channel.class); MessagingMessageListenerAdapter listener = getSimpleInstance("withGenericMessageFooType", Message.class); listener.setMessageConverter(new Jackson2JsonMessageConverter()); message.getMessageProperties().setContentType("application/json"); listener.onMessage(message, channel); assertEquals(Foo.class, this.sample.payload.getClass()); }
@Test public void invalidPayloadType() throws Exception { MessagingMessageListenerAdapter listener = createDefaultInstance(Integer.class); Channel channel = mock(Channel.class); thrown.expect(ListenerExecutionFailedException.class); thrown.expectCause(Matchers.isA(org.springframework.messaging.converter.MessageConversionException.class)); thrown.expectMessage(getDefaultListenerMethod(Integer.class).toGenericString()); // ref to method listener.onMessage(MessageTestUtils.createTextMessage("test"), channel); // test is not a valid integer }
@Test public void resolveRabbitMessageHeaderAccessor() throws Exception { MessagingMessageListenerAdapter listener = createDefaultInstance(AmqpMessageHeaderAccessor.class); Channel channel = mock(Channel.class); MessageProperties properties = new MessageProperties(); properties.setHeader("customBoolean", true); properties.setAppId("myAppId"); org.springframework.amqp.core.Message message = MessageTestUtils.createTextMessage("my payload", properties); listener.onMessage(message, channel); assertDefaultListenerMethodInvocation(); }
@Test public void resolveHeaders() throws Exception { MessagingMessageListenerAdapter listener = createDefaultInstance(String.class, Map.class); Channel channel = mock(Channel.class); MessageProperties properties = new MessageProperties(); properties.setHeader("customInt", 1234); properties.setMessageId("abcd-1234"); org.springframework.amqp.core.Message message = MessageTestUtils.createTextMessage("my payload", properties); listener.onMessage(message, channel); assertDefaultListenerMethodInvocation(); }
@Test public void resolveMessageHeaders() throws Exception { MessagingMessageListenerAdapter listener = createDefaultInstance(MessageHeaders.class); Channel channel = mock(Channel.class); MessageProperties properties = new MessageProperties(); properties.setHeader("customLong", 4567L); properties.setType("myMessageType"); org.springframework.amqp.core.Message message = MessageTestUtils.createTextMessage("my payload", properties); listener.onMessage(message, channel); assertDefaultListenerMethodInvocation(); }
@Test public void resolveHeaderAndPayload() throws Exception { MessagingMessageListenerAdapter listener = createDefaultInstance(String.class, int.class, String.class, String.class); Channel channel = mock(Channel.class); MessageProperties properties = new MessageProperties(); properties.setHeader("myCounter", 55); properties.setConsumerTag("consumerTag"); properties.setConsumerQueue("queue"); org.springframework.amqp.core.Message message = MessageTestUtils.createTextMessage("my payload", properties); listener.onMessage(message, channel); assertDefaultListenerMethodInvocation(); }
@Test public void validatePayloadInvalid() throws Exception { DefaultMessageHandlerMethodFactory customFactory = new DefaultMessageHandlerMethodFactory(); customFactory.setValidator(testValidator("invalid value")); Method method = getListenerMethod("validatePayload", String.class); MessagingMessageListenerAdapter listener = createInstance(customFactory, method); Channel channel = mock(Channel.class); thrown.expect(ListenerExecutionFailedException.class); listener.onMessage(MessageTestUtils.createTextMessage("invalid value"), channel); // test is an invalid value }
@Test public void resolveObjectPayload() throws Exception { MessagingMessageListenerAdapter listener = createDefaultInstance(MyBean.class); MyBean myBean = new MyBean(); myBean.name = "myBean name"; Channel channel = mock(Channel.class); MessageProperties messageProperties = new MessageProperties(); messageProperties.setContentType(MessageProperties.CONTENT_TYPE_SERIALIZED_OBJECT); org.springframework.amqp.core.Message message = new org.springframework.amqp.core.Message(SerializationUtils.serialize(myBean), messageProperties); listener.onMessage(message, channel); assertDefaultListenerMethodInvocation(); }
@Test public void validatePayloadValid() throws Exception { String methodName = "validatePayload"; DefaultMessageHandlerMethodFactory customFactory = new DefaultMessageHandlerMethodFactory(); customFactory.setValidator(testValidator("invalid value")); initializeFactory(customFactory); Method method = getListenerMethod(methodName, String.class); MessagingMessageListenerAdapter listener = createInstance(customFactory, method); Channel channel = mock(Channel.class); listener.onMessage(MessageTestUtils.createTextMessage("test"), channel); // test is a valid value assertListenerMethodInvocation(sample, methodName); }