2012-12-24 153 views
4

我正在編寫一個使用Jersey下的引擎向Java RESTful API(第三方)發送HTTP請求的Java類。如何模擬Jersey REST客戶端拋出HTTP 500響應?

我還想編寫一個JUnit測試來模擬發送HTTP 500響應的API。作爲新澤西州的新手,我很難看到我必須做些什麼來模擬這些HTTP 500響應。

到目前爲止,這是我最好的嘗試:

// The main class-under-test 
public class MyJerseyAdaptor { 
    public void send() { 
     ClientConfig config = new DefaultClientConfig(); 
     Client client = Client.create(config); 
     String uri = UriBuilder.fromUri("http://example.com/whatever").build(); 
     WebResource service = client.resource(uri); 

     // I *believe* this is where Jersey actually makes the API call... 
     service.path("rest").path("somePath") 
       .accept(MediaType.TEXT_HTML).get(String.class); 
    } 
} 

@Test 
public void sendThrowsOnHttp500() { 
    // GIVEN 
    MyJerseyAdaptor adaptor = new MyJerseyAdaptor(); 

    // WHEN 
    try { 
     adaptor.send(); 

     // THEN - we should never get here since we have mocked the server to 
     // return an HTTP 500 
     org.junit.Assert.fail(); 
    } 
    catch(RuntimeException rte) { 
     ; 
    } 
} 

我熟悉不過的Mockito在嘲諷庫中沒有偏好。基本上,如果有人可以告訴我需要嘲笑哪些類/方法來拋出HTTP 500響應,我可以弄清楚如何實際執行這些模擬。

回答

4

試試這個:

WebResource service = client.resource(uri); 

WebResource serviceSpy = Mockito.spy(service); 

Mockito.doThrow(new RuntimeException("500!")).when(serviceSpy).get(Mockito.any(String.class)); 

serviceSpy.path("rest").path("somePath") 
      .accept(MediaType.TEXT_HTML).get(String.class); 

我不知道的球衣,但是從我的理解,我想調用get()方法時,實際調用完成。 因此,您只需使用真實的WebResource對象並替換get(String)方法的行爲來拋出異常,而不是實際執行http調用。

1

我正在編寫一個Jersey web應用程序......並且我們爲HTTP錯誤響應拋出了WebApplicationException。您可以簡單地將響應代碼作爲構造函數參數傳遞。例如,

throw new WebApplicationException(500); 

當服務器端引發此異常時,它在我的瀏覽器中顯示爲500 HTTP響應。

不知道這是你想要的...但我認爲輸入可能有幫助!祝你好運。

+0

謝謝@ ktm5124(+1) - 但我需要從*客戶端*嘲笑這一點。這是我打的第三方API,所以我不能在服務器代碼中嘲笑任何東西。再次感謝! – IAmYourFaja

+0

ClientHandlerException是您需要的類嗎?我沒有和澤西客戶合作過,所以我可能會在這裏黑暗中。順便說一句,謝謝你把我放在魔鬼的標記之上! – ktm5124

相關問題