Java 测试SpringCloudStreams服务的问题

Java 测试SpringCloudStreams服务的问题,java,spring-boot,testing,apache-kafka,spring-cloud-stream,Java,Spring Boot,Testing,Apache Kafka,Spring Cloud Stream,我在测试我的spring云流服务时遇到问题(该服务写入Kafka流)。它的基础是: 这是服务代码(细节省略) 这是测试 @SpringBootTest @RunWith(SpringRunner.class) public class KafkaWriterServiceTest { @Autowired private Source source; @Autowired private MessageCollector collector; @Au

我在测试我的spring云流服务时遇到问题(该服务写入Kafka流)。它的基础是:

这是服务代码(细节省略)

这是测试

@SpringBootTest
@RunWith(SpringRunner.class)
public class KafkaWriterServiceTest {

    @Autowired
    private Source source;

    @Autowired
    private MessageCollector collector;

    @Autowired
    private KafkaWriterService service;

    @Test
    public void testMessages() {
        BlockingQueue<Message<?>> messages = collector.forChannel(source.output());
        service.write("FooBar");

        Object payload = messages.poll().getPayload();
        System.out.println(payload);
    }
@SpringBootTest
@RunWith(SpringRunner.class)
公共类KafkawriterService测试{
@自动连线
私人来源;
@自动连线
私有消息收集器;
@自动连线
私人卡夫卡维特服务;
@试验
公共void testMessages(){

BlockingQueue更新:

如果您正在寻找卡夫卡制作人示例,请对您的服务进行以下更改:

@Service
@EnableBinding({Source.class})
public class KafkaWriterService {

    private final MessageChannel output;

    public KafkaWriterService(@Qualifier("output") MessageChannel output) {
        this.output = output;
    }

    public void write(String str) {
        output.send(MessageBuilder.withPayload(str).build());
    }
}

@SendTo
需要通过
@StreamListener
的消息源。它用于转换输入消息

在测试程序中,没有生成任何消息

将代码更改为以下内容,以便在测试中生成消息:

@Service
@EnableBinding({Source.class, Sink.class})
public class KafkaWriterService {

    @StreamListener(Sink.INPUT)
    @SendTo(Source.OUTPUT)
    public String write(String str) {
        return "Transformed: " + str;
    }
}
@SpringBootTest
@RunWith(SpringRunner.class)
公共类KafkawriterService测试{
@自动连线
私人水槽;
@自动连线
私人来源;
@自动连线
私有消息收集器;
@自动连线
私人卡夫卡维特服务;
@试验
公共void testMessages(){

Blocking Queue我使用了您提供的代码,这似乎不是问题所在,感谢您的建议,尽管我已更新了答案。我注意到没有生成输入消息,也没有消息侦听器。使用
Sink
@StreamListener
修复此问题将允许您成功轮询消息在您的测试中。但这不是我正在实现的功能。我希望在调用该方法时服务写入流,而不是在将其写入接收器时,这是一个有效的用法。此外,我对您的评论感到好奇“@SendTo需要通过@StreamListener提供消息源”我找不到这方面的任何提及,你能给我指一下吗?它在这里的样本中:
@Service
@EnableBinding({Source.class, Sink.class})
public class KafkaWriterService {

    @StreamListener(Sink.INPUT)
    @SendTo(Source.OUTPUT)
    public String write(String str) {
        return "Transformed: " + str;
    }
}
@SpringBootTest
@RunWith(SpringRunner.class)
public class KafkaWriterServiceTest {

    @Autowired
    private Sink sink;

    @Autowired
    private Source source;

    @Autowired
    private MessageCollector collector;

    @Autowired
    private KafkaWriterService service;

    @Test
    public void testMessages() {
        BlockingQueue<Message<?>> messages = collector.forChannel(source.output());
        sink.input().send(MessageBuilder.withPayload("Hello World!").build());

        Object payload = messages.poll().getPayload();
        System.out.println(payload);
    }
}