Kafka测试容器片状测试

时间:2018-12-24 00:25:57

标签: java spring docker specifications testcontainers

将kafka集成到我的春季项目中。已经使用TestContainer方法编写了一个集成,但是测试有时会失败。 kafka服务器初始化似乎有些问题。

这是我的下面的代码

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()

}

现在有趣的是,如果我在测试中发送消息之前添加 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
    }
}

1 个答案:

答案 0 :(得分:1)

您是否正在预先创建要制作的主题?尝试这样做。不确定这是否是您面临的问题(需要日志),但是当自动创建主题时,将花费一些时间为其所有分区分配领导者。