nikosd23
nikosd23

Reputation: 85

Gmail Api Java Client - Use mockito/powermock example to mock Gmail API calls

We are using the Gmail API Java Client version 1.19.0. Is there anyone that has implemented successfully a working mock object that could be used for stubing requests such as:

gmailClient.users().history().list("me").setStartHistoryId(startHistoryId).setPageToken(pageToken).execute();

Essentially, we would like to stub the above call and create a specific response, to test different business scenarios.

Upvotes: 0

Views: 986

Answers (3)

bedla.czech
bedla.czech

Reputation: 1219

There is also MockHttpTransport helper class for such a scenario. Please consult with documentation chapter HTTP Unit Testing

HttpTransport transport = new MockHttpTransport() {
  @Override
  public LowLevelHttpRequest buildRequest(String method, String url) throws IOException {
    return new MockLowLevelHttpRequest() {
      @Override
      public LowLevelHttpResponse execute() throws IOException {
        MockLowLevelHttpResponse response = new MockLowLevelHttpResponse();
        response.addHeader("custom_header", "value");
        response.setStatusCode(404);
        response.setContentType(Json.MEDIA_TYPE);
        response.setContent("{\"error\":\"not found\"}");
        return response;
      }
    };
  }
};

Upvotes: 0

nikosd23
nikosd23

Reputation: 85

Please check below a working example of the above question. No need to use powermock. Mockito is only needed.

    @Before
    public void init() throws Exception{
        ListHistoryResponse historyResponse = new ListHistoryResponse();
        historyResponse.setHistoryId(BigInteger.valueOf(1234L));
        List<History> historyList = new ArrayList<>();
        History historyEntry = new History();
        Message message = new Message();
        message.setId("123456");
        message.setThreadId("123456");
        List<Message> messages = new ArrayList<>();
        messages.add(message);
        historyEntry.setMessages(messages);
        historyList.add(historyEntry);

        mock = mock(Gmail.class);
        Gmail.Users users = mock(Gmail.Users.class);
        Gmail.Users.History history = mock(Gmail.Users.History.class);
        Gmail.Users.History.List list = mock(Gmail.Users.History.List.class);
        when(mock.users()).thenReturn(users);
        when(users.history()).thenReturn(history);
        when(history.list("me")).thenReturn(list);
        when(list.setStartHistoryId(BigInteger.valueOf(123L))).thenReturn(list);
        when(list.setPageToken(null)).thenReturn(list);
        when(list.execute()).thenReturn(historyResponse);

}

Upvotes: 1

Eric D
Eric D

Reputation: 7159

you can mock the classes are long as they're not final, etc. what's the limitation here? (haven't looked at the source code for the Google java client libraries but shouldn't be gmail-specific--if you've found someone doing it for another Google java client API you should be able to re-use it).

Upvotes: 0

Related Questions