Spring cloud stream test - метод, который отправляет сообщение через пользовательский канал в конце - PullRequest
0 голосов
/ 26 апреля 2020

Я создал собственный канал в облачном потоке Spring с пользовательскими входами и выходами. Предположим, это созданный канал:

public interface Channel {

  String FOO = "foo-request";
  String BAR = "bar-response";

  @Input(FOO)
  SubscribableChannel fooRequest();

  @Output(BAR)
  MessageChannel barResponse();

}

Что-то. java:

public class Something{

  @Autowired
  private Channel channel;

  public void doSomething(..){
    // Do some steps
    channel.barRequest().send(MessageBuilder.withPayload(outputMessage).build())
  }

}

Как видно, я добавляю пользовательский канал в классе Something в отправьте сообщение в конце метода.

Когда я хочу протестировать этот метод, у меня возникают некоторые проблемы с внедрением в классе Something. Я не могу внедрить класс Something, потому что это не компонент. Но этот класс внедряет объект Channel, как это видно. Итак, вот что я сделал, чтобы передать ограничение на введение внутреннего свойства для этого класса:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {MyChannel.class})

public class SomethingTest{

  @Autowired
  private Channel myChannel;

  @Test
  public void TestDoSomething(){
  // cannot inject it as it does not have any qualified bean
  Something something = new Something();
  ReflectionTestUtils.setField(something, "channel", channel);
  }

  @EnableBinding(Channel.class)
  public static class MyChannel {

  }
}

Без строки ReflectionTestUtls я получаю NullPointerException на channel.barRequest().send() в doSomething метод. Имея эту строку для прохождения внедренного объекта, я получаю следующую ошибку:

org.springframework.messaging.MessageDeliveryException: Dispatcher has no subscribers for channel 'application.bar-response'.; nested exception is org.springframework.integration.MessageDispatchingException: Dispatcher has no subscribers

Прежде всего, я не уверен, что то, что я делаю, является лучшим способом работы с моим настраиваемым каналом и Тестирование соответствующего метода, поэтому, пожалуйста, дайте мне знать, если есть лучший способ. Во-вторых, почему я получаю это исключение и как я могу его устранить?

PS: я уже установил необходимые конфигурации в моем файле application.yml для теста, связанного со связывателями и каналами, аналогично тому, как Я делал с запуском приложения в обычном режиме. Этот подход до сих пор работал с другими свойствами.

...