首页 > 解决方案 > 用 mockito 模拟 Unirest

问题描述

我正处于开始编程阶段,我想询问有关使用 Mockito 模拟对象的问题,更具体地说是 Unirest 的响应。假设我有一个数据库,每次进行测试时我都不想打扰它,我想为此使用 Mockito,但问题是我不确定如何创建会返回的假“httpResponse”对象. 为了提供一些上下文,我附上了我的代码:

    /**
 * 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;
}

所以我的想法是模拟 Unirest,然后当一个 .get 方法被调用时,我会返回一个假的 HttpResponse,问题是,我不知道怎么做,我在网上看了,并不能真正赚到感觉。是否可以使用实际数据库执行 1 次,然后“提取”信息并每次都使用该信息进行测试?

标签: javatestingmockitounirest

解决方案


使用 PowerMockRunner、PowerMockito 和 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);
      }

    }

推荐阅读