mocking依赖在构造函数中初始化

z9zf31ra  于 2021-06-08  发布在  Kafka
关注(0)|答案(2)|浏览(316)

我想模拟在构造函数中初始化的依赖项,在我的例子中,我想模拟kafka producer,这样我就可以模拟通过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);
}

有谁能建议如何做到这一点吗。

uz75evzq

uz75evzq1#

我想你可以用powermock。它允许在示例化时返回自定义对象。像这样:

@RunWith(PowerMockRunner.class)
@PrepareForTest({TargetClass.class})
public class Test {
    @Before
    public void setUp() throws Exception {
        PowerMockito.whenNew(TargetClass.class).withAnyArguments().thenReturn(/* instance with you target constructor arguments */);
    }
}
px9o7tmv

px9o7tmv2#

无法模拟构造函数创建的对象。理想情况下,在创建类时,不应该示例化要模拟的类。无论如何,有几个解决办法来实现这一点。
将kafkaproducer作为构造函数中的参数传递。
添加一个setkafkaproducer方法以仅用于单元测试,并将mock对象设置到类中。
使用反射设置私有字段http://www.java2s.com/code/java/reflection/setprivatefieldvalue.htm

相关问题