如何模拟测试REST客户端?

时间:2012-10-23 13:45:38

标签: unit-testing rest mocking mockito

我有一个我正在尝试测试的Rest Service Client。 这是我试图测试的客户端方法:

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();
    }
}

这是我的测试课程:

@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();
    }
}

我的问题是,当我运行此测试时,它会在执行NullPointerException时向我抛出result.getBody()。 (结果为空)

2 个答案:

答案 0 :(得分:4)

您将SUT(受测系统)与模拟的协作者混合在一起。 SUT是你测试的方法。协作者根据需要播放并返回数据,以便SUT工作。

  1. 调用您要测试的RestPriceService sut实例: TODO
  2. 模拟restTemplate确定
  3. 为此模拟器命名,使其像restTemplateMock一样突出: TODO
  4. 将其设置为sut确定
  5. 使用when(restTemplateMock.exchange(...).thenReturn(r) TODO
  6. 致电sut.getPriceRow TODO
  7. 验证此次调用返回的RestPriceRow是否正确: TODO
  8. 验证restTemplateMock TODO
  9. 修改

    如果您想阅读关于不同形式的单元测试的非常好书,我可以推荐XUnit Test Patterns

答案 1 :(得分:0)

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

http://jersey.java.net/nonav/documentation/latest/test-framework.html

但是如果你只想测试服务层,你可以编写正常的junit测试。