gpt4 book ai didi

java - 如何模拟这个创建kafka主题并等待 future 对象的简单方法?

转载 作者:行者123 更新时间:2023-12-02 09:46:20 26 4
gpt4 key购买 nike

我正在尝试模拟这个创建kafka主题并等待 future 对象完成的方法。无法模拟以下行:

createResult.values().get(topic).get();

测试用例在上面一行以 NullPointerException 终止。

    @Test
public void testCreateKafkaTopic(){

MyClass myClass = new MyClass();

PowerMockito.mockStatic(AdminClient.class);
final KafkaAdminClient kafkaAdminClient = mock(KafkaAdminClient.class);
NewTopic newTopicMock = mock(NewTopic.class);
CreateTopicsResult createTopicsResultMock = mock(CreateTopicsResult.class);
final KafkaFuture<Void> futureMock = mock(KafkaFuture.class);
Map<String, KafkaFuture<Void>> map = mock(Map.class);



PowerMockito.when(AdminClient.create(any(Properties.class))).thenReturn(kafkaAdminClient);
PowerMockito.whenNew(NewTopic.class).withAnyArguments().thenReturn(newTopicMock);
PowerMockito.when(createTopicsResultMock.values()).thenReturn(map);
PowerMockito.when(map.get("fakeTopic").get()).thenReturn(futureMock);

PowerMockito.when(futureMock.isDone()).thenReturn(true);
myClass.createKafkaTopic("fakeTopic");

}
}

实用程序类:

import java.util.Collections;
import java.util.Properties;
import org.apache.kafka.clients.admin.AdminClient;
import org.apache.kafka.clients.admin.CreateTopicsResult;
import org.apache.kafka.clients.admin.KafkaAdminClient;
import org.apache.kafka.clients.admin.NewTopic;
import org.apache.kafka.clients.consumer.ConsumerConfig;

public class MyClass {

public void createKafkaTopic(String topic) {
AdminClient adminClient = null;
CreateTopicsResult createResult = null;
NewTopic newTopic = null;
String bootStrapServers = "localhost:9092";
try {
adminClient = KafkaAdminClient.create(clientConfig(bootStrapServers));
newTopic = new NewTopic(topic, 1, (short) 1);
createResult = adminClient.createTopics(Collections.singleton(newTopic));
createResult.values().get(topic).get();
} catch (Exception e) {
e.printStackTrace(); }
}
}

出现以下错误:

Exception ocurred null java.lang.NullPointerException: at createResult.values().get(topic).get();

您能帮我解决上述错误吗?

最佳答案

我认为你需要将这一行分成两部分

PowerMockito.when(map.get("fakeTopic").get()).thenReturn(futureMock);

类似于:

PowerMockito.when(map.get("fakeTopic")).thenReturn(entry);
PowerMockito.when(entry.get()).thenReturn(futureMock);

基本上,当您的代码尝试获取主题 createResult.values().get(topic).get() 时,您会遇到空指针异常,因为 createResult.values() .get(topic) 为空。

还有一点:我建议使用依赖注入(inject)模式,而不是在管理客户端的方法实例化中。这样,您就可以摆脱 Powermockito 并只使用 Mockito。或者至少将您的管理客户端移动为静态类字段并且仅实例化一次。

关于java - 如何模拟这个创建kafka主题并等待 future 对象的简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56617721/

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