Mockito mockStatic on InjectMocks Object

1k Views Asked by At

I'm using Mockito 3.6 to take advantage of their mockStatic method. I am having issue when mocking a class that is also the main class to be used for testing.

public class MainClass{
    private HttpClient httpClient;

    public String sendRequest(){
        HttpRequest request = HttpRequest.newBuilder()
            .uri(buildUri(System.getEnv("host"), System.getEnv("port")))
            .GET().build()
        HttpResponse<String> response = httpClient.send(request, ofString());
        return response.body
    }

    public static URI buildURI(String host, String path) throws URISyntaxException {
        return new URI("http", host, path, null);
    }
}

This is my test class

@ExtendWith(MockitoExtension.class)
public class MainClassTest {
    @Spy
    private ObjectMapper mapper = new ObjectMapper();
    @Mock
    private HttpClient httpClientMock;
    @InjectMocks
    private MainClass mainClass;

    private MockedStatic<MainClass> systemMock;

    @BeforeEach
    void setUp() {
        systemMock = mockStatic(MainClass.class);
    }

    @AfterEach
    void tearDown() {
        systemMock.close();
    }

    @Test
    void sendRequest_successful(){
        HttpResponse response = mock(HttpResponse.class);
        when(response.body()).thenReturn("Hello, world!");
        when(httpClientMock.send(any(HttpRequest.class), any())).thenReturn(response);
        systemMock.when(() -> MainClass.buildURI(anyString(), anyString()))
                .thenReturn(URI.create("http://host.com/path"));

        assertEquals("Hello, world!", mainClass.sendRequest());
    }
}

Since the MainClass is being used to be mockStatic and injectMock, when calling buildURI, it always return null, which is not acceptable when creating HttpRequest.

Edit: To clarify my issue, I'm getting the host and port from environment variable, which will be null when running this test, and calling new URI() does not allow null values.

0

There are 0 best solutions below