创建 http 响应作为 mockito 的返回值



我是Mockito测试的新手,正在测试GET请求。

我已经模拟了调用,但现在我需要返回HttpResponse<Cars[]>因为这些值稍后在 for 循环中使用。

如何创建一个虚拟HttpResponse,其中主体包含Car对象的数组。

CarProvider 中使用 Get 请求的方法是:

public HttpResponse<Cars[]> getCars(String carId, String carname) {
    return Unirest.get(endpointUrl)
          .header("Accept", MediaType.APPLICATION_JSON)
          .queryString("carId",cardId)
          .queryString("carname",carname)
          .asObject(Cars[].class);
}

这在以下方法中的另一个类CarsUsers中使用:

public List<Cars> getCars(String carId, String carname) {
  HttpResponse<Cars[]> response = carProvider.getCars(carId, carname);
  for(Cars car: response.getBody){
     //use car and do something
}

我的测试方法如下:

public class TestClass {
    @Mock
    HttpResponse<Cars[]> httpresponse;
    @Mock
    CarsProvider carsProvider;
    @Mock
    CarsUser carsUser;
    @Test
    public void getCarsTest(){
     Mockito.when(carsUser.getCars(Matchers.anyString(), 
     Matchers.anyString())).thenReturn(getDummyCarsList());
     Mockito.when(carsProvider.getCars(Matchers.anyString(), 
     Matchers.anyString())).thenReturn(httpResponse);
     }
    private List<Cars> getDummyCarsList(){
    //create a dummy list of cars
    }
}

NullPointerException指着for(Cars car: response.getBody){}.

我假设身体没有任何值,因此抛出异常。

感谢任何帮助或建议。

谢谢

你真的需要CarProvider来返回HttpResponse<Car[]>吗?

感觉底层通信(HttpResponse(的一个方面可能在这里泄漏。如果CarProvider的目的是提供汽车,那么也许应该相应地输入。

因此,如果您按如下方式声明CarProvider...

public class CarProvider {
    // should perhaps consider List<Car> instead of Car[] here ...
    public Cars[] getCars(String carId, String carname) {
        HttpResponse<Car{}> response = Unirest.get(endpointUrl)
          .header("Accept", MediaType.APPLICATION_JSON)
          .queryString("carId",cardId)
          .queryString("carname",carname);
        return deserialise(response.getBody());
    }
    private Car[] deserialise(ResponseBody body) {
        // read the body and deserialise to Car[] 
    }
}

。然后,您的测试方法将简化为:

@Test
public void getCarsTest(){
    Mockito.when(carsUser.getCars(anyString(), anyString())).thenReturn(getDummyCarsList());
    // ...
}
private Cars[] getDummyCarsList(){
    return new Car{} {new Car(...), new Car(...)};
}

但是,如果这真的是不可能的,并且您真的必须模拟HttpResponse<Car[]>那么它看起来像这样:

HttpResponse<Car[]> mockedResponse = Mockito.mock(HttpResponse.class);
Mockito.when(mockedResponse.getCode()).thenReturn(200);
Mockito.when(mockedResponse.getBody()).thenReturn(someSerialisedFormOfYourCarArray);
Mockito.when(carsUser.getCars(anyString(), anyString())).thenReturn(mockedResponse);

最新更新