Я создал собственный канал в облачном потоке 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
для теста, связанного со связывателями и каналами, аналогично тому, как Я делал с запуском приложения в обычном режиме. Этот подход до сих пор работал с другими свойствами.