简体   繁体   中英

How to use Mockito to mock a request in Jersey client?

I have a class to post POJO to an external API. I want to test this method.

public int sendRequest(Event event) {

   Client client = ClientBuilder.newClient();
   WebTarget baseTarget = client.target(some url);
   Invocation.Builder builder = baseTarget.request();
   Response response = builder.post(Entity.entity(event, MediaType.APPLICATION_JSON));
   int statusCode = response.getStatus();
   String type = response.getHeaderString("Content-Type");


  if (Status.Family.SUCCESSFUL == Status.Family.familyOf(statusCode)) {
        m_log.debug("The event was successfully processed by t API %s", event);
  }

  else if (Status.Family.CLIENT_ERROR == Status.Family.familyOf(statusCode)) {
      m_log.error("Status code : <%s> The request was not successfully processed by API. %s", statusCode, event);
  }

  return statusCode;
 }

I wrote a unit test like this

@Test
  public void sendRequest_postAuditEvent_returnOK() {
  int statusCode = EventProcessor.sendRequest(event);
  assertEquals(Status.OK.getStatusCode(), statusCode);
 }

But this will send a real request to the API. I am new to Mockito. Can anyone help me how to mock this request?

Edit:

@Mock Client m_client;
@Mock WebTarget m_webTarget;
@Mock Invocation.Builder m_builder;
@Mock Response m_response;

@Test
public void sendRequest_postAuditEvent_returnOK() {
  when(m_client.target(anyString())).thenReturn(m_webTarget);
  when(m_webTarget.request()).thenReturn(m_builder);
  when(m_builder.post(Entity.entity(m_AuditEvent, MediaType.APPLICATION_JSON))).thenReturn(m_response);
  when(m_response.getStatus()).thenReturn(Response.Status.BAD_REQUEST.getStatusCode());
  assertEquals(Status.BAD_REQUEST.getStatusCode(), m_AuditEventProcessor.sendRequest(m_AuditEvent));
}

I try to mock the methods but it doesn't work. Still call the real method.

Ideally, the class should take a Client in its constructor so you could replace the real client instance with a mock when testing it.

class EventProcessor {
    private Client client;

    public EventProcessor(Client client) {
        this.client = client;
    }

    public int sendRequest(Event event) {
        WebTarget baseTarget = client.target(some url);
        ...
    }
}

You can use powerMockito like this post Mocking static methods with Mockito

If you can mock this returned object ClientBuilder.newClient() you can mock all the other objects in the call chain.

PowerMockito.mockStatic(ClientBuilder.class);
BDDMockito.given(ClientBuilder.newClient(...)).willReturn([a Mockito.mock()...]);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM