Mocking Apache HTTPClient using Mockito

后端 未结 5 814
走了就别回头了
走了就别回头了 2020-12-25 11:24

I\'m trying to mock Apache HttpClient Interface in order to mock one of its methods mentioned below to return a stubbed JSON object in response.

HttpResponse         


        
5条回答
  •  遥遥无期
    2020-12-25 11:43

    There is a nicer way to do this without having to add PowerMock as yet another dependency. Here you only need an extra constructor taking HTTPClient as an argument and Mockito. In this example I'm creating a custom health check (Spring Actuator) and I need to mock the HTTPClient for unit testing.

    Libs: JUnit 5, Spring Boot 2.1.2 and Mockito 2.

    Component:

    @Component
    public class MyHealthCheck extends AbstractHealthIndicator {
    
        HttpClient httpClient;
    
        public MyHealthCheck() { 
            httpClient = HttpClientBuilder.create().build();
        }
    
        /** 
        Added another constructor to the class with an HttpClient argument.
        This one can be used for testing
        */ 
        public MyHealthCheck(HttpClient httpClient) { 
            this.httpClient = httpClient; 
        }
    
        /**
        Method to test 
        */ 
        @Override
        protected void doHealthCheck(Builder builder) throws Exception {
    
            //
            // Execute request and get status code
            HttpGet request = new HttpGet("http://www.SomeAuthEndpoint.com");
            HttpResponse response = httpClient.execute(request);
    
            //
            // Update builder according to status code
            int statusCode = response.getStatusLine().getStatusCode();
            if(statusCode == 200 || statusCode == 401) {
                builder.up().withDetail("Code from service", statusCode);
            } else {
                builder.unknown().withDetail("Code from service", statusCode);
            }
        }
    }
    

    Test method:

    Note that here we use Mockito.any(HttpGet.class)

    private static HttpClient httpClient;
    private static HttpResponse httpResponse;
    private static StatusLine statusLine;
    
    @BeforeAll
    public static void init() {
        //
        // Given
        httpClient = Mockito.mock(HttpClient.class);
        httpResponse = Mockito.mock(HttpResponse.class);
        statusLine = Mockito.mock(StatusLine.class);
    }
    
    
    @Test
    public void doHealthCheck_endReturns401_shouldReturnUp() throws Exception {
    
        //
        // When
        when(statusLine.getStatusCode()).thenReturn(401);
        when(httpResponse.getStatusLine()).thenReturn(statusLine);
        when(httpClient.execute(Mockito.any(HttpGet.class))).thenReturn(httpResponse);
    
        //
        // Then
        MyHealthCheck myHealthCheck = new MyHealthCheck(httpClient);
        Health.Builder builder = new Health.Builder();
        myHealthCheck.doHealthCheck(builder);
        Status status = builder.build().getStatus();
        Assertions.assertTrue(Status.UP == status);
    }
    

提交回复
热议问题