2016-06-13 55 views
4

我正在嘗試編寫一個測試輔助類中的方法的JUnit測試用例。該方法使用REST調用外部應用程序,這是我試圖在JUnit測試中模擬的這個調用。用MockRestServiceServer嘲笑REST調用

輔助方法使用Spring的RestTemplate進行REST調用。

在我的測試中,我創建了一個模擬REST服務器和模擬REST模板和instanitiate他們是這樣的:

@Before 
public void setUp() throws Exception { 
    mockServer = MockRestServiceServer.createServer(helperClass.getRestTemplate()); 
} 

我再播種模擬服務器,以便當輔助方法使得它應該返回一個適當的反應REST調用:

// response is some XML in a String 
mockServer 
    .expect(MockRestRequestMatchers.requestTo(new URI(myURL))) 
    .andExpect(MockRestRequestMatchers.method(HttpMethod.GET)) 
    .andRespond(MockRestResponseCreators.withStatus(HttpStatus.OK) 
     .contentType(MediaType.APPLICATION_XML) 
     .body(response)); 

當我運行我的測試時,helper方法收到來自REST調用的空響應並且測試失敗。

其餘網址助手造就了查詢參數,看起來像這樣:「http://server:port/application/resource?queryparam1=value1&queryparam2=value2」。

我試圖把URL(「http://server:port/application/resource」)都與無查詢參數在‘myURL’變量(引起的匹配,使其返回響應),但不能得到模擬服務器返回任何東西。

我試着尋找這種代碼的例子,但還沒有找到任何東西,這似乎像我的方案。

春季版4.1.7。

在此先感謝您的幫助。

+0

Tha用於將該類寫入靜態方法的不同之處在於它不像其他許多源一樣。 'requestTo'。 – sjngm

回答

6

當您創建的MockRestServiceServer一個實例,你應該使用的是正在使用你的產品代碼RestTemplate現有實例。因此,請嘗試將RestTemplate注入到您的測試中,並在調用MockRestServiceServer.createServer時使用它 - 請勿在測試中創建新的RestTemplate

+0

這個問題是我的錯。我爲測試使用了一個模擬RestTemplate對象,而不是根據您的建議正確實例化的對象。一旦這個被替換,測試成功運行。 – GarlicBread

+0

我也遇到了測試RestTemplate的問題。但是,就我而言,我無法訪問RestTemplate實例。我的助手類中的代碼就像'new RestTemplate()。exchange(uri,HttpMethod.GET,...)'。我如何測試這個。 –

4

似乎你正在嘗試測試其餘的客戶端,其餘的服務器應該在其他地方測試。 您正在使用RestTemplate - >調用服務。然後,試圖模擬RestTemplate及其調用的結果。

@Mock 
RestTemplate restTemplateMock; 

和服務在測試類

@InjectMocks 
Service service; 

讓我們說,服務必須是測試作爲

public void filterData() { 
    MyResponseModel response = restTemplate.getForObject(serviceURL, MyResponseModel.class); 
    // further processing with response 
} 

的方法之後,測試篩選數據的方法,你需要模擬響應從restTemplate調用如

mockResponseModel = createMockResponse(); 
Mockito.when(restTemplateMock.getForObject(serviceURL, MyResponseModel.class)).thenReturn(mockResponseModel); 

service.filterData(); 
//Other assert/verify,... go here