如何模拟一个带有参数的类并对其进行验证?

时间:2019-07-24 22:12:55

标签: scalamock

我正在尝试模拟org.apache.kafka.clients.producer.KafkaProducer。 但是由于类的实现,模拟失败。输入参数经过验证,如果为null,则抛出null指针异常。 我该如何嘲笑它?

我认为失败的原因是,类KafkaProducer的第一个参数是扩展了ProducerConfig的{​​{1}}。它验证传递的属性。如果为null,则将引发null指针异常。

AbstractConfig
import org.apache.kafka.clients.producer.{KafkaProducer, ProducerConfig}
import org.scalamock.scalatest.MockFactory

object MyProducerTest extends MockFactory  with App {

  val mockKafkaProducer = mock[KafkaProducer[String,String]]

}

1 个答案:

答案 0 :(得分:0)

我认为您可以尝试使用自己的自定义类扩展对象。

class MyKafkaProducer extends KafkaProducer[String, String]()
val mockKafkaProducer = mock[MyKafkaProducer]

或者,模拟在您的KafkaProducer上方进行调用的类。像这样:

# main:
class BusinessApp {

  // create a KafkaProducer

  def sendMessage(msg: String) = {
    kafkaProducer.send(new ProducerRecord(msg))
  }
}

# tests:
val mockBusinessApp = mock[BusinessApp]
(mockBusinessApp.sendMessage _).expects("test").returns(true)

那么您就不是在嘲笑KafkaProducer的较低级API。

请注意,您可以使用embedded kafka,而不必完全模拟KafkaProducer,并且可以获取在测试过程中产生/消耗的实际消息。