java - 在构造函数中初始化的模拟依赖项

标签 java junit mocking mockito apache-kafka

我想模拟构造函数中初始化的依赖项,在我的例子中,我想模拟 Kafka 生产者,以便我可以模拟通过 kafka 发送消息,我的代码如下所示:

private Producer<String, String> producer;

private int messageTimeOut;
private String topicName;

@Autowired
public classConstructor(@Value("${bootstrap.servers}") String bootstrapServers,
        @Value("${topic.name}") String topicName, @Value("${message.send.timeout}") int messageTimeOut) {
    this.messageTimeOut = messageTimeOut;
    this.topicName = topicName;
    Properties props = new Properties();
    props.put("bootstrap.servers", bootstrapServers);
    props.put("key.serializer", StringSerializer.class.getName());
    props.put("value.serializer", StringSerializer.class.getName());
    props.put("acks", "all");
    producer = new KafkaProducer<>(props);
}

任何人都可以建议如何实现这一目标。

最佳答案

无法模拟构造函数创建的对象。理想情况下,当您创建类时,您不应该实例化要模拟的类。 无论如何,有几种解决方法可以实现这一目标。

  1. 将 KafkaProducer 作为参数传递到构造函数中。
  2. 添加一个 setKafkaProducer 方法仅用于单元测试,并将模拟对象设置到类中。
  3. 使用Reflection设置私有(private)字段 http://www.java2s.com/Code/Java/Reflection/Setprivatefieldvalue.htm

关于java - 在构造函数中初始化的模拟依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38177789/

相关文章:

java - Android 4.0.3 进度对话框关闭

java - JUnit-Test 类测试和项目测试之间存在差异

ruby-on-rails - 我如何在 Rails minitest 中使用 mock?

unit-testing - 不使用部分模拟?他们在网络应用程序中也意味着吗?

php - 用具体值模拟 atLeastOnce,其余的不重要

java - 在时间戳中的任何位置查找日期

java - 无法从静态上下文中引用非静态方法 'inflate(byte[],int,int)'

java - mockito test 在作为 junit test 运行时没有给出这样的方法错误,但是当在运行配置中手动添加 jar 时,它运行良好

java - 启用 webmvc 时,基于 Spring Java 的配置和 JUnit 不起作用

java - Android:UIL 我希望能够多次加载同一张图像