nad*_*ads 5 unit-testing scala mocking mockito scalatest
我想为 Scala 类编写单元测试。该类的目的是收集指标并将其发布到 Kafka 主题上。我试图在单元测试中模拟生产者,以确保其余代码的健全性。下面是我的课程的简化版本:
class MyEmitter(sparkConf: SparkConf) {
<snip> -- member variables
private val kafkaProducer = createProducer()
def createProducer(): Producer[String, MyMetricClass] = {
val props = new Properties()
...
Code to initialize properties
...
new KafkaProducer[String, MyMetricClass](props)
}
def initEmitter(metricName: String): SomeClass = {
// Some implementation
}
def collect(key: String, value: String): Unit = {
// Some implementation
}
def emit(): Unit = {
val record = new ProducerRecord("<topic name>", "<key>", "<value>")
kafkaProducer.send(record)
}
Run Code Online (Sandbox Code Playgroud)
我想在单元测试中做的是模拟生产者并检查是否已调用send()命令,如果是,则生产者记录是否符合预期。我自己未能成功找到解决方案。谷歌搜索解决方案也没有结果。如果有人知道如何解决该问题,我将不胜感激。
“new”通常是测试的敌人,因此您应该提取该对象的创建,以便您可以传递真正的 KafkaProducer 或模拟
一种无需更改界面即可实现的方法是
def createProducer(
producer: Properties => KafkaProducer = props => new KafkaProducer[String, MyMetricClass](props)
): Producer[String, MyMetricClass] = {
val props = new Properties()
producer(props)
}
Run Code Online (Sandbox Code Playgroud)
所以在实际代码中你继续调用
myEmmiter.createProducer()
Run Code Online (Sandbox Code Playgroud)
但在测试中你会做
val producerMock = mock[KafkaProducer]
myEmmiter.createProducer(_ => producerMock)
Run Code Online (Sandbox Code Playgroud)
另一个好处是您还可以存根函数本身,以便您可以验证props您的方法创建的是否是预期的
希望能帮助到你
| 归档时间: |
|
| 查看次数: |
2130 次 |
| 最近记录: |