I’m trying to write a unit test case for this method:
@Bean
public ApiClient apiClient() throws IOException {
try (FileReader fileReader = new FileReader(kubeConfigPath)) {
final ApiClient client = ClientBuilder.kubeconfig(KubeConfig.loadKubeConfig(fileReader)).build();
final OkHttpClient httpClient = client.getHttpClient().newBuilder()
.readTimeout(0, TimeUnit.SECONDS)
.writeTimeout(WRITE_TIMEOUT_SECONDS, TimeUnit.SECONDS)
.connectTimeout(CONNECT_TIMEOUT_SECONDS, TimeUnit.SECONDS)
.build();
client.setHttpClient(httpClient);
return client;
}
}
Test case:
@Test
public void testApiClientConfigurations() throws IOException {
FileReader fileReader = Instancio.create(FileReader.class);
KubeConfig kubeConfig = Instancio.create(KubeConfig.class);
OkHttpClient.Builder httpClientBuilder = mock(OkHttpClient.Builder.class);
OkHttpClient httpClient = mock(OkHttpClient.class);
when(KubeConfig.loadKubeConfig(fileReader)).thenReturn(kubeConfig);
when(apiClient.getHttpClient()).thenReturn(httpClient);
when(httpClient.newBuilder()).thenReturn(httpClientBuilder);
when(httpClientBuilder.readTimeout(0, TimeUnit.SECONDS)).thenReturn(httpClientBuilder);
when(httpClientBuilder.writeTimeout(10, TimeUnit.SECONDS)).thenReturn(httpClientBuilder);
when(httpClientBuilder.connectTimeout(10, TimeUnit.SECONDS)).thenReturn(httpClientBuilder);
when(httpClientBuilder.build()).thenReturn(httpClient);
when(apiClient.setHttpClient(httpClient)).thenReturn(apiClient);
//Act
kubernetesConfig.apiClient();
}
I get this error now:
java.lang.NullPointerException: Cannot invoke "sun.nio.cs.StreamDecoder.read(char[], int, int)" because "this.sd" is null
at java.base/java.io.InputStreamReader.read(InputStreamReader.java:177)
at org.yaml.snakeyaml.reader.StreamReader.update(StreamReader.java:180)
at org.yaml.snakeyaml.reader.StreamReader.ensureEnoughData(StreamReader.java:173)
at org.yaml.snakeyaml.reader.StreamReader.ensureEnoughData(StreamReader.java:168)
at org.yaml.snakeyaml.reader.StreamReader.peek(StreamReader.java:123)
at org.yaml.snakeyaml.scanner.ScannerImpl.scanToNextToken(ScannerImpl.java:1204)
at org.yaml.snakeyaml.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:320)
at org.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:238)
at org.yaml.snakeyaml.parser.ParserImpl$ParseImplicitDocumentStart.produce(ParserImpl.java:210)
at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:161)
at org.yaml.snakeyaml.parser.ParserImpl.checkEvent(ParserImpl.java:152)
at org.yaml.snakeyaml.composer.Composer.getSingleNode(Composer.java:156)
at org.yaml.snakeyaml.constructor.BaseConstructor.getSingleData(BaseConstructor.java:178)
at org.yaml.snakeyaml.Yaml.loadFromReader(Yaml.java:493)
at org.yaml.snakeyaml.Yaml.load(Yaml.java:446)
at io.kubernetes.client.util.KubeConfig.loadKubeConfig(KubeConfig.java:89)
at config.KubernetesConfigTest.testApiClientConfigurations(KubernetesConfigTest.java:98)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
I’m not sure how to mock internal methods that are been used in my config method. This is the dependency I’m using: https://github.com/kubernetes-client/java
1