Search code examples
javatestingmockitounirest

Mocking Unirest with mockito


I am in my starting programming phase and I wanted to ask about mocking Objects with Mockito, more specifically is the Unirest response. Let's say I have a database, and I dont what to bother it every time I do testing, and I want to use Mockito for that, but the problem is I am not sure how to create the fake "httpResponse" object that will come back. To give some context, I have attached my code:

    /**
 * This method lists the ID of the activity when requested.
 *
 * @return the list of all activities
 */
public  JSONArray getActivites() {
    HttpResponse<JsonNode> jsonResponse = null;
    try {
        jsonResponse = Unirest
                .get("http://111.111.111.111:8080/activity")
                .header("accept", "application/json")
                .asJson();
    } catch (UnirestException e) {
        System.out.println("Server is unreachable");
    }

    JSONArray listOfActivities = jsonResponse.getBody().getArray();
    return listOfActivities;
}

So what I had in mind, is to mock Unirest, and then when a .get method gets invoked, I would return a fake HttpResponse, problem is, I am not sure how to, I have looked online and couldn't really make much sense of it. Is it possible to do it 1 time with the actual Database, and then "Extract" the information and to use that every time for testing?


Solution

  • Sample Snippet with PowerMockRunner, PowerMockito and Mockito

    @RunWith(PowerMockRunner.class)
        @PrepareForTest({ Unirest.class})
        public class TestApp{
    
          @Before
          public void setup() {
            PowerMockito.mockStatic(Unirest.class);
          }
    
          @Test
          public void shouldTestgetActivites() throws UnirestException {
            when(Unirest.get(Client.DEFAULT_BASE_URL)).thenReturn(getRequest);
            when(getRequest.asJson()).thenReturn(httpResponse);
            when(httpResponse.getStatus()).thenReturn(Integer.valueOf(200));
    
            assertThat(something).isEqualTo(true);
          }
    
        }