Java 测试SpringCloudStreams服务的问题
我在测试我的spring云流服务时遇到问题(该服务写入Kafka流)。它的基础是: 这是服务代码(细节省略) 这是测试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
@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);
}
}