2017-11-17 164 views
1

我試圖測試一個Java方法,它向遠程REST服務器發出請求以檢索一些JSON數據,從該JSON中提取一個ID,然後使用該ID向另一個端點上的同一服務器發出另一個請求。如何在Java中的相同測試中使用多個端點來模擬REST服務器?

使用Mockito的MockRestServiceServer,我可以成功地模擬和測試期望對一個端點發出單一請求的服務器,但似乎無法使用它來創建具有一組預定義端點的服務器,並帶有自己的期望和響應。

我如何模擬一個具有多個端點的服務器,用於測試向遠程服務器發出多個不同請求的單個函數?

+0

儘管我相信你已經連貫地寫下了你的問題,但我很難理解爲什麼你不能只提出多個請求。向第一個端點發送請求,解析JSON響應,然後使用先前解析的JSON向其中一個不同端點提交新請求,並根據需要重複多次。 Mockito的MockRestServiceServer在其服務器的API中可能有一些代碼,可以讓你這樣做,所以也許可以深入其文檔。 –

+1

我想在一個web腳本中測試一個函數,這個腳本會進行兩個API調用。據我所知,我不能在MockRestServiceServer上先發制人地定義兩個端點,然後運行該方法,以便在調用該函數時在模擬服務器中存在兩個端點。 – AdvilPill

+0

@AdvillPill好吧,一個好的短期修復可能是運行兩個MockRestServiceServers,每個MockRestServiceServers都有自己的端點。 –

回答

-1

我的答案假定您使用的是SpringBoot,但這個想法可以一般地應用。

使您的類依賴於RestOperations接口,以便您可以在測試時傳遞存根。

類被測

public class Foo { 
    private final RestOperations restOperations; 

    public Foo(RestOperations restOperations) { 
    this.restOperations = restOperations; 
    } 
} 

測試

public void test() { 
    Foo foo = new Foo(new MyStub()); 
    } 

依靠抽象,不具體實現。

2

所以我實際上能夠解決我的問題。關鍵是要手動創建自己的MockRestServiceServerBuilder建立你MockRestServiceServer而不是使用createServer(RestTemplate)或bindTo(RestTemplate).build()方法,像這樣:

MockRestServiceServer.MockRestServiceServerBuilder builder = 
    MockRestServiceServer.bindTo(restTemplate); 
builder.ignoreExpectOrder(true); 
MockRestServiceServer server = builder.build(); 

通過這樣做,根本RequestExpectationManager場在MockRestServiceServer中被初始化爲一個UnorderedRequestExpectationManager,允許你匹配請求,而不管它們的順序。這爲我解決了很多麻煩。

相關問題