0

I am trying to use okhttp3 MockWebServer for my Junit5 test but seems it is not using MockWebServer and instead calls actual url resulting to Auth errors (401 status). Here is my test class, I am newbie to MockWebServer , is there anything wrong with my test code?

package com.abcd.abcdeopenaiapi.chatcompletion;

import com.abcd.abcdeopenaiapi.apiresponse.OpenAiChatCompletionResponse;
import okhttp3.mockwebserver.MockResponse;
import okhttp3.mockwebserver.MockWebServer;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.TestPropertySource;

import java.io.IOException;
import java.util.List;

@SpringBootTest
@TestPropertySource(locations="classpath:application-test.properties")
public class ChatCompletionControllerTest
{
  public MockWebServer mockWebServer;

  @Autowired
  ChatCompletionController chatCompletionController;
  
  @BeforeEach
  void setUp() throws IOException {

    mockWebServer = new MockWebServer();
    mockWebServer.url("https://xy-ab-cd-api001.openai.com/openai/chat/completions?api-version=123-preview"); //todo

    MockResponse mockResponse = new MockResponse()
            .addHeader("Content-Type", "application/json; charset=utf-8")
            .setBody("Success");

    mockWebServer.enqueue(mockResponse);
  }

  @Test
  public void openAiCompletionApi_Success() throws Exception {
    OpenAIChatCompletionRequest.OpenAIChatCompletionRequestBuilder builder = OpenAIChatCompletionRequest.builder();
    OpenAIChatCompletionRequest chatCompletionRequest = builder.messages(List.of())
                                                               .stream(false)
                                                               .n(1)
                                                               .stop(null)
                                                               .topP(1.0)
                                                               .logitBias(null)
                                                               .maxTokens(400)
                                                               .presence_penalty(0)
                                                               .temperature(0.2)
                                                               .frequency_penalty(0)
                                                               .build();

    ResponseEntity<OpenAiChatCompletionResponse> responseEntity = chatCompletionController.openAiCompletionApi(
           chatCompletionRequest);

    System.out.println(responseEntity); // this will be replaced with assertion once solution works

  }

}

This is implementation of actual method from controller, that class http url.

@NotNull
  private ResponseEntity<OpenAiChatCompletionResponse> getOpenAiChatCompletionResponseResponseEntity(Response httpResponse) throws IOException
  {
    if (httpResponse.body() != null)
    {
      String responseString = httpResponse.body().string();
      if(StringUtils.isNotEmpty(responseString))
      {
        log.info("Response string from http call is: " + responseString);
        OpenAiChatCompletionResponse openAICompletionResponse = objectMapper.readValue(responseString,
                                                                                       OpenAiChatCompletionResponse.class);
        return ResponseEntity.ok(openAICompletionResponse);
      }
    }
    log.error("No content available in Success Response");
    return ResponseEntity.noContent().build();
  }

It works after making below changes:

  1. Remove https://xy-ab-cd-api001.openai.com from method call mockWebServer.url, seems like MockWebServer mocks localhost urls, how do we mock a custom url? or may be it is not possible.
  2. Replace https with http
  3. Add port using mockWebServer.start(8080)

I am looking for solution for all of these 3 workaround I had to implement.

Vipin
  • 4,851
  • 3
  • 35
  • 65

0 Answers0