gpt4 book ai didi

java - 清除单元测试的kafka主题

转载 作者:搜寻专家 更新时间:2023-11-01 03:18:35 25 4
gpt4 key购买 nike

我需要对 kafka 应用程序执行单元测试,避免使用第三方库。

我现在的问题是我想在测试之间清除所有主题,但我不知道如何。

这是我的临时解决方案:提交每次测试后产生的每条消息,并将所有测试消费者放在同一个消费者组中。

override protected def afterEach():Unit={
val cleanerConsumer= newConsumer(Seq.empty)
val topics=cleanerConsumer.listTopics()
println("pulisco")
cleanerConsumer.subscribe(topics.keySet())
cleanerConsumer.poll(100)
cleanerConsumer.commitSync()
cleanerConsumer.close()
}

虽然这不起作用,但我不知道为什么。

例如,当我在测试中创建一个新的消费者时,messages 包含在之前的测试中产生的消息。

val consumerProbe = newConsumer(SMSGatewayTopic)

val messages = consumerProbe.poll(1000)

我该如何解决这个问题?

最佳答案

您还可以在测试源中嵌入 Kafka/Zookeeper 实例,以更好地控制此类隔离服务。

trait Kafka { self: ZooKeeper =>
Kafka.start()
}

object Kafka {
import org.apache.hadoop.fs.FileUtil
import kafka.server.KafkaServer

@volatile private var started = false

lazy val logDir = java.nio.file.Files.createTempDirectory("kafka-log").toFile

lazy val kafkaServer: KafkaServer = {
val config = com.typesafe.config.ConfigFactory.
load(this.getClass.getClassLoader)

val (host, port) = {
val (h, p) = config.getString("kafka.servers").span(_ != ':')
h -> p.drop(1).toInt
}

val serverConf = new kafka.server.KafkaConfig({
val props = new java.util.Properties()
props.put("port", port.toString)
props.put("broker.id", port.toString)
props.put("log.dir", logDir.getAbsolutePath)

props.put(
"zookeeper.connect",
s"localhost:${config getInt "test.zookeeper.port"}"
)

props
})

new KafkaServer(serverConf)
}

def start(): Unit = if (!started) {
try {
kafkaServer.startup()
started = true
} catch {
case err: Throwable =>
println(s"fails to start Kafka: ${err.getMessage}")
throw err
}
}

def stop(): Unit = try {
if (started) kafkaServer.shutdown()
} finally {
FileUtil.fullyDelete(logDir)
}
}

trait ZooKeeper {
ZooKeeper.start()
}

object ZooKeeper {
import java.nio.file.Files
import java.net.InetSocketAddress
import org.apache.hadoop.fs.FileUtil
import org.apache.zookeeper.server.ZooKeeperServer
import org.apache.zookeeper.server.ServerCnxnFactory

@volatile private var started = false
lazy val logDir = Files.createTempDirectory("zk-log").toFile
lazy val snapshotDir = Files.createTempDirectory("zk-snapshots").toFile

lazy val (zkServer, zkFactory) = {
val srv = new ZooKeeperServer(
snapshotDir, logDir, 500
)

val config = com.typesafe.config.ConfigFactory.
load(this.getClass.getClassLoader)
val port = config.getInt("test.zookeeper.port")

srv -> ServerCnxnFactory.createFactory(
new InetSocketAddress("localhost", port), 1024
)
}

def start(): Unit = if (!zkServer.isRunning) {
try {
zkFactory.startup(zkServer)

started = true

while (!zkServer.isRunning) {
Thread.sleep(500)
}
} catch {
case err: Throwable =>
println(s"fails to start ZooKeeper: ${err.getMessage}")
throw err
}
}

def stop(): Unit = try {
if (started) zkFactory.shutdown()
} finally {
try { FileUtil.fullyDelete(logDir) } catch { case _: Throwable => () }
FileUtil.fullyDelete(snapshotDir)
}
}

测试类可以使用 ZooKeeper 扩展 Kafka 以确保它可用。

如果测试 JVM 没有 fork ,可以使用 SBT testOptions in Test 设置中的 Tests.Cleanup 来停止测试后的嵌入式服务。

关于java - 清除单元测试的kafka主题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38851171/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com