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

标签 java rest junit mockito httpresponse

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

我已经 mock 了这个电话,但现在我需要返回 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){} .

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

感谢任何帮助或建议。

谢谢

最佳答案

你真的需要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);

关于java - 创建http响应作为mockito的返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48259926/

相关文章:

java - 将可序列化对象传递给挂起的 Intent

Java - Collections.sort() 性能

java - Intellij 断点不停止

c# - 如何在 C# 中通过 DropBoxRest API 获取 Dropbox 文件?

php - WordPress WP REST API 按域限制请求

java - 返回空 JSON 的 Jersey Web 服务

java - 按指定顺序运行 JUnit4 测试类

Java 16位CRC数据包验证

java - 如何在 JUnit 4.12 中组合 @Rule 和 @ClassRule

maven - 如何在maven中只运行一个junit测试用例?