Java 卡夫卡试验容器片状试验
将卡夫卡整合到我的春季项目中。使用TestContainer方法编写了一个集成,但测试时常失败。似乎卡夫卡服务器的初始化有问题 下面是我的代码Java 卡夫卡试验容器片状试验,java,spring,docker,specifications,testcontainers,Java,Spring,Docker,Specifications,Testcontainers,将卡夫卡整合到我的春季项目中。使用TestContainer方法编写了一个集成,但测试时常失败。似乎卡夫卡服务器的初始化有问题 下面是我的代码 def setupSpec() { kafka = new KafkaContainer() kafka.start() System.setProperty("kafka.consumer.endpoint", kafka.bootstrapServers.replace("PLAINTEXT://", "")) } def
def setupSpec() {
kafka = new KafkaContainer()
kafka.start()
System.setProperty("kafka.consumer.endpoint", kafka.bootstrapServers.replace("PLAINTEXT://", ""))
}
def setup() {
RestAssured.port = port
}
def "test profile update events"() {
given:
String INPUT_TOPIC = "EventXX"
when:
KafkaProducer<String, String> kafkaProducer = createProducer()
kafkaProducer.send(new ProducerRecord<>(INPUT_TOPIC, "foo")).get().topic()
kafkaProducer.send(new ProducerRecord<>(INPUT_TOPIC, "foo")).get().topic()
kafkaProducer.send(new ProducerRecord<>(INPUT_TOPIC, "foo")).get().topic()
kafkaProducer.send(new ProducerRecord<>(INPUT_TOPIC, "foo")).get().topic()
then:
TestUtil.waitFor({ EventConsumer.msgConsumed == true }, 5000)
kafkaProducer.close()
}
def setupSpec(){
卡夫卡=新卡夫卡容器()
kafka.start()
System.setProperty(“kafka.consumer.endpoint”,kafka.bootstrapserver.replace(“明文:/”,“”))
}
def设置(){
restasured.port=端口
}
def“测试配置文件更新事件”(){
鉴于:
字符串输入\u TOPIC=“EventXX”
什么时候:
KafkaProducer KafkaProducer=createProducer()
kafkaProducer.send(新产品记录(输入主题“foo”)).get().TOPIC()
kafkaProducer.send(新产品记录(输入主题“foo”)).get().TOPIC()
kafkaProducer.send(新产品记录(输入主题“foo”)).get().TOPIC()
kafkaProducer.send(新产品记录(输入主题“foo”)).get().TOPIC()
然后:
TestUtil.waitFor({EventConsumer.msgConsumed==true},5000)
卡夫卡制作人关闭()
}
现在有趣的是,如果我在测试中发送消息之前添加Thread.sleep(10000),它总是有效的,但是这种方法看起来有点脏。在运行任何测试之前,我们如何确保kafka服务器已启动并运行。我通过验证setupSpec中的kafkaSendRecieve尝试了以下方法,但失败了。我正在粘贴下面的代码
def validatekafkaSendRecieve() {
def started = false
String INPUT_TOPIC = "kafkaTest"
def producer = createProducer()
def consumer = createConsumer(INPUT_TOPIC)
Thread.sleep(9000)
while (!started) {
producer.send(new ProducerRecord<>(INPUT_TOPIC, "foo")).get()
started = consumeMessage(INPUT_TOPIC, consumer)
}
producer.close()
consumer.close()
}
def consumeMessage(String topic, KafkaConsumer kafkaConsumer) {
def message = kafkaConsumer.poll(3)
if (!message.isEmpty()) {
def messageList = message.records(topic).asList()
if (messageList != null && !message.isEmpty()) {
return true
}
} else {
return false
}
}
def validatekafkaSendRecieve(){
def started=false
字符串输入\u TOPIC=“kafkaTest”
def producer=createProducer()
def consumer=createConsumer(输入_主题)
线程睡眠(9000)
而(!已启动){
producer.send(新ProducerRecord(输入主题“foo”).get()
started=consumeMessage(输入\主题,消费者)
}
制作人关闭()
consumer.close()
}
def consumeressage(字符串主题,KafkaConsumer-KafkaConsumer){
def message=kafkaConsumer.poll(3)
如果(!message.isEmpty()){
def messageList=message.records(主题).asList()
if(messageList!=null&&!message.isEmpty()){
返回真值
}
}否则{
返回错误
}
}
您是否预先创建了制作主题?试着这样做。不确定这是否是您面临的问题(需要日志),但当自动创建主题时,所有分区都需要一段时间才能指定一个领导者。我刚刚忘记了这个问题,我尝试过这样做,但效果很好:)