1

I have a Spring Cloud project with a module that binds to messagebus kafka and rabbitmq. in this module I have a test for kafka:

@ActiveProfiles("test")
@DirtiesContext
@ExtendWith(SpringExtension.class)
@ContextConfiguration(classes = MessageReceiverTestConfiguration.class,
        initializers = ConfigFileApplicationContextInitializer.class)
@EnableBinding(MessageReceivingChannel.class)
public class MessageReceiverITest {

    @Autowired
    private MessageReceivingChannel messageReceivingChannel;

    @MockBean
    private MessageConsumerService messageConsumerService;

    @Autowired
    private MessageConverter messageConverter;

    @Autowired
    private MessageReceiverTestConfiguration receiverTestConfiguration;

    @Captor
    private ArgumentCaptor<ImportantMessage> captorMessage;

    @Captor
    private ArgumentCaptor<MessageHeaders> captorHeaders;

    @Test
    public void testLoanApplicationChannelInput() throws Throwable {
        final ImportantMessage sentMessage = new ImportantMessage("qwer124asdf");

        final Map<String, Object> headerMap = new HashMap<>(1);
        headerMap.put(MessageHeaders.CONTENT_TYPE, receiverTestConfiguration.getContentType());
        MessageHeaders sentHeaders = new MessageHeaders(headerMap);

        final Message<?> message = messageConverter.toMessage(sentMessage, sentHeaders);
        messageReceivingChannel.input().send(message);

        TimeUnit.SECONDS.sleep(1);

        verify(messageConsumerService).takeActionOn(captorMessage.capture(), captorHeaders.capture());

        final Object receivedMessage = captorMessage.getValue();
        Assertions.assertThat(receivedMessage).isNotNull();
        Assertions.assertThat(receivedMessage).isEqualTo(sentMessage);
        MessageHeaders receivedHeaders = captorHeaders.getValue();
        Assertions.assertThat(receivedHeaders).isNotNull();
        Assertions.assertThat(receivedHeaders.get(MessageHeaders.CONTENT_TYPE).toString())
                .isEqualTo(sentHeaders.get(MessageHeaders.CONTENT_TYPE));
    }
}

which runs in IDE (idea) just fine.

the problem is when I try to install maven artifact, it doesn't pass the verify phase because:

org.springframework.context.ApplicationContextException: Failed to start bean 'inputBindingLifecycle'; nested exception is java.lang.IllegalStateException: A default binder has been requested, but there is more than one binder available for 'org.springframework.cloud.stream.messaging.DirectWithAttributesChannel' : kafka,rabbit, and no default binder has been set.

and this is how I set the default binder in test/resources/application-test.yml:

logging:
  config: classpath:logback-local.xml

spring:
  cloud:
    stream:
      default:
        contentType: application/*+avro
        producer:
          headerMode: embeddedHeaders
      bindings:
        messagereceived:
          binder: kafka
          contentType: "application/json"
      default-binder: kafka
      kafka:
        binder:
          configuration:
            security:
              protocol: SSL
            ssl:
              truststore:
                location: ${JAVA_HOME}\lib\security\cacerts
                password: ***
                type: JKS
  kafka:
    properties:
      max.in.flight.requests.per.connection: 1
      request.timeout.ms: 30000
      max.block.ms: 3000
    producer:
      retries:  3

so my question is how to set default binder for spring-cloud-starter-parent:Hoxton.SR9 properly?

Thanks for advices!

Sergey Vasnev
  • 783
  • 5
  • 18
greengold
  • 1,184
  • 3
  • 18
  • 43

0 Answers0