2012-10-23 149 views
2

我有一個Rest服務客戶端,我試圖測試。 這是客戶的方法我想測試:如何模擬測試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(); 
    } 
} 

這是我的測試類:

@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()。 (結果爲空)

+0

你不*測試*'getPriceRow',你*嘲笑*它。你測試什麼?你的SUT(被測系統)是什麼?被嘲笑的合作者是什麼? – 2012-10-23 13:52:46

+0

我以爲我沒有嘲笑服務..所以我需要改變測試getPriceRow? – Bruno

回答

4

您將SUT(系統測試中)與嘲諷的合作者混淆在一起。 SUT是你測試的方法。協作者一起玩,並根據需要返回數據以便SUT正常工作。

  1. 調用您想測試sutRestPriceService實例:TODO
  2. 模擬restTemplateOK
  3. 給這個假名字,使得它堅持像restTemplateMockTODO
  4. 將它設置爲sut好吧
  5. 使用when(restTemplateMock.exchange(...).thenReturn(r)TODO
  6. 呼叫sut.getPriceRowTODO
  7. 驗證此調用返回的RestPriceRow是正確的:TODO
  8. 驗證restTemplateMockTODO

編輯:

如果你想閱讀非常有用關於不同形式的單元測試的好書,我可以推薦XUnit Test Patterns

+0

不錯,首先感謝您的快速回復。 但我有一個關於第5點的問題: 交換呼叫是我嘗試測試的方法的一部分,我認爲它不適合更改服務中的測試代碼。 我錯過了什麼嗎? – Bruno

+0

也許我沒有向自己解釋好。 getPriceRow方法不是測試類的一部分,它是我正在測試的服務中的一種方法 – Bruno

+0

在您的代碼中,getPriceRow是REST * client *的方法。如果你想測試這個客戶*的行爲,而沒有真正的REST服務,你必須模擬你想測試的代碼所調用的所有協作者的方法。 – 2012-10-23 14:19:31

0

所以這裏有兩個問題。如果你想測試REST接口,即進行調用並查看結果並檢查,我推薦使用Jersey Test框架。它運行在測試服務器上,可以節省大量工作。 (假設你使用的是新澤西州。)

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

但如果你只想測試服務層,你可以寫正常的JUnit測試。

+0

這是一個關於單元測試的問題,而不是集成測試。在單元測試中,不進行遠程呼叫。 – 2012-10-23 14:07:47