Unit testing 如何模拟测试REST客户端?

Unit testing 如何模拟测试REST客户端?,unit-testing,rest,mocking,mockito,Unit Testing,Rest,Mocking,Mockito,我有一个Rest服务客户端,我正在尝试测试它。 这是我尝试测试的客户端方法: public RestPriceRow getPriceRow(String customer, String product, String qt) throws Exception { // Prepare acceptable media type List<MediaType> acceptableMediaTypes = new ArrayList<MediaType

我有一个Rest服务客户端,我正在尝试测试它。 这是我尝试测试的客户端方法:

public RestPriceRow getPriceRow(String customer, String product, String qt)
    throws Exception {
    // Prepare acceptable media type
    List<MediaType> acceptableMediaTypes = new ArrayList<MediaType>();
    acceptableMediaTypes.add(MediaType.APPLICATION_XML);

    // Prepare header
    HttpHeaders headers = new HttpHeaders();
    headers.setAccept(acceptableMediaTypes);
    HttpEntity<PriceRowDto> entity = new HttpEntity<PriceRowDto>(headers);

    // Prepare response
    RestPriceRow res = new RestPriceRow();

    // Send the request as GET
    try {
        ResponseEntity<PriceRowDto> result =
          restTemplate.exchange(baseURL + "{customerId}/{productId}/{quantity}",
          HttpMethod.GET, entity, PriceRowDto.class, customer,product,qt);
        PriceRowDto response = result.getBody();
        return response;
    } catch (Exception e) {
        e.printStackTrace();
    }
}

我的问题是,当我运行这个测试时,它在执行result.getBody时抛出一个NullPointerException。结果为空,因此这里有两个问题。如果您想测试REST接口,即进行调用并查看结果并进行检查,我建议使用Jersey测试框架。它在测试服务器上运行,可以节省大量工作。假设你正在使用球衣


但是如果您只想测试服务层,您可以编写普通的junit测试。

因此这里有两个问题。如果您想测试REST接口,即进行调用并查看结果并进行检查,我建议使用Jersey测试框架。它在测试服务器上运行,可以节省大量工作。假设你正在使用球衣


但是,如果您只想测试服务层,您可以编写普通的junit测试。

您将测试中的SUT系统与模拟的协作者混为一谈。SUT是你测试谁的方法。协作者配合并返回SUT工作所需的数据

调用要测试sut:TODO的RestPriceService实例 模拟restTemplate:好的 给这个mock起一个名字,使它像restemplatemock:TODO一样突出 把它调成sut:好的 使用WhenRetemplateMock.exchange…然后返回器:TODO 调用sut.getPriceRow:TODO 验证此调用返回的RestPriceRow是否正确:TODO 验证restTemplateMock:TODO 编辑:


如果您想阅读一本关于不同形式的单元测试的好书,我可以推荐。

您将测试中的SUT系统与模拟的协作者混为一谈。SUT是你测试谁的方法。协作者配合并返回SUT工作所需的数据

调用要测试sut:TODO的RestPriceService实例 模拟restTemplate:好的 给这个mock起一个名字,使它像restemplatemock:TODO一样突出 把它调成sut:好的 使用WhenRetemplateMock.exchange…然后返回器:TODO 调用sut.getPriceRow:TODO 验证此调用返回的RestPriceRow是否正确:TODO 验证restTemplateMock:TODO 编辑:


如果你想读一本关于不同形式的单元测试的好书,我可以推荐。

你不测试getPriceRow,你可以模仿它。你测试什么?你测试的SUT系统是什么,被模仿的合作者是什么?我以为我不是在模仿服务。。那么我需要做些什么来测试getPriceRow呢?你不测试getPriceRow,而是模拟它。你测试什么?你测试的SUT系统是什么,被模仿的合作者是什么?我以为我不是在模仿服务。。那么我需要做些什么来测试getPriceRow呢?这是一个关于单元测试的问题,而不是关于集成测试的问题。在单元测试中,没有远程调用。这是关于单元测试的问题,而不是关于集成测试的问题。在单元测试中,没有远程调用。很好,首先感谢您的快速响应。但是我有一个关于第5点的问题:交换调用是我试图测试的方法的一部分,我认为在服务中更改测试代码是不好的。我是不是漏掉了什么?也许我没有好好解释。getPriceRow方法不是测试类的一部分,它是我正在测试的服务中的一个方法。在您的代码中,getPriceRow是REST客户端的一个方法。如果您想在没有真正的REST服务的情况下测试此客户端的行为,则必须模拟要测试的代码调用的协作者的所有方法。很抱歉坚持,但我无法实现此功能。。在安装程序上,我将模拟RestTemplate并将其设置为服务RestPriceServiceImpl。然后我使用whenrestPriceService.getPriceRow100200,16.thenReturnr;。getPriceRow使用exchange。所以我想我不能在交换时使用when.thenReturn不要在when这样的Mockito方法中使用restPriceService。restPriceService是您测试的,而不是所谓的。我建议尝试一个简单的Mockito示例来了解它。很好,首先感谢您的快速响应。但是我有一个关于第5点的问题:交换调用是我试图测试的方法的一部分,我认为在服务中更改测试代码是不好的。我是不是漏掉了什么?也许我没有好好解释。getPriceRow方法不是测试类的一部分,它是我正在测试的服务中的一个方法。在您的代码中,getPriceRow是REST客户端的一个方法。如果您想在没有真正的REST服务的情况下测试此客户端的行为,则必须模拟要测试的代码调用的协作者的所有方法。很抱歉坚持,但我无法实现此功能。。在安装程序上,我将模拟RestTemplate并将其设置为服务RestPriceServiceImpl。然后我使用whenrestPriceService.getPriceRow100200,16.thenReturnr;。getPriceRow使用exchange。所以我想我不能在交换时使用when.thenReturn不要在when这样的Mockito方法中使用restPriceService。R estPriceService是您测试的内容,而不是所谓的内容。我建议尝试使用一个简单的Mockito示例来了解它。
@Before
public void setUp() {
    RestTemplate r = mock(RestTemplate.class);
    restPriceService = new RestPriceServiceImpl();
    restPriceService.setRestTemplate(r);
    restPriceService.setBaseURL("url");
}

@Test
public void prueba() {
    PriceRowDto r = new PriceRowDto("100","200","9","10","0","19/11/2012");
    try {
        when(restPriceService.getPriceRow("100","200","16")).thenReturn(r);
    } catch (Exception e) {
        e.printStackTrace();
    }
}