2017-10-16 72 views
0

我正在編寫使用具有非常類似屬性的各種REST API端點的應用程序。唯一的區別在於端點地址和有效負載。標題,方法和其他內容保持不變。這就是爲什麼我創建的類與我的遠程主機進行通信,它被稱爲RestApiCommunicator有方法generateRequestAndCallEndpoint(List payload)一個包裝有效載荷與執行REST調用所需的所有必需的東西。 比,我有各種各樣的類只調用這個通信器類與適當的端點後綴其資源。 一切工作正常,但我想單元測試所有這些類。我試圖通過閱讀很多SO問題來弄清楚如何做到這一點,但它們是相當複雜的案例,我很簡單。 我想一個適當的方式找出該單元測試類,看起來像這樣的:單元測試類僅使用局部變量進行組合

class MyRestClient { 

    public void useRestApi(List<MyResources> myResources) { 
     RestApiCommunicator restApiCommunicator = new RestApiCommunicator ("/some/endpoint"); 
     restApiCommunicator.generateRequestAndCallEndpoint(myResources); 
    } 
} 

我想測試,如果溝通與適當enpoint ADRESS創建,如果generateRequestAndCallEndpoint與我的樣品稱爲exacly一次有效載荷。

是我腦海

唯一的事情就是讓restApiCommunicator一個字段,這個字段創建setter和單元測試嘲笑它。但是,在我看來,這是相當髒的解決方案,我不想修改我的代碼以允許測試。

也許你可以點我在一些地方的方向,我可以有這個類使用一些好的模式進行測試。

(PS如果關鍵 - 這是一個春天啓動的應用程序)

回答

0

你可以在溝通

class MyRestClient { 
    private RestApiCommunicatorFactory factory = ... 

    public void useRestApi(List<MyResources> myResources) { 
     factory.getCommunicator("/some/endpoint") 
      .generateRequestAndCallEndpoint(myResources); 
    } 

在你的單元測試提供了一個工廠,你提供的工廠的模擬,它返回模擬通信器。具體的語言取決於你選擇的嘲笑庫。

0

一種方法做的正是你的要求(即「測試如果溝通與適當enpoint ADRESS創建,如果generateRequestAndCallEndpoint與我的樣品有效載荷調用一次」)是使用JMockit嘲笑它:

public final class MyRestClientTest { 
    @Tested MyRestClient restClient; 
    @Mocked RestApiCommunicator restApi; 

    @Test 
    public void verifyUseOfRestApi() { 
     List<MyResource> resources = asList(new MyResource("a"), new MyResource("b")); 

     restClient.useRestApi(resources); 

     new Verifications() {{ 
      new RestApiCommunicator("/some/endpoint"); 
      restApi.generateRequestAndCallEndpoint(resources); times = 1; 
     }}; 
    } 
}