2012-10-26 97 views
2

我正在使用Jersey客戶端對我的服務運行一些集成測試。但是,我的一個呼叫發送重定向。我希望獲得重定向,但是當Jersey Client通過com.sun.jersey.api.client.UniformInterfaceException獲取重定向錯誤時。有沒有辦法讓它接受重定向的響應,讓我知道它有什麼?如何阻止球衣客戶端在Http 301上拋出異常?

+0

你設法解決它嗎? –

+2

如果您將實體類型設置爲ClientResponse而不是String等,您將不會得到異常。然後您可以閱讀回覆代碼並自行發出新的請求。我還沒有找到辦法做到這一點透明 –

回答

1

您可以捕獲UniformInterfaceException,它提供了包含所有細節的響應字段。

你可以額外寫一些hamcrest匹配器來表達自己的期望:

import static javax.ws.rs.core.Response.Status.*; 
import static org.junit.rules.ExpectedException.*; 

import javax.ws.rs.core.Response.Status; 

import org.hamcrest.*; 
import org.junit.*; 
import org.junit.rules.ExpectedException; 

import com.sun.jersey.api.client.*; 

public class MyResourceShould { 

    @Rule 
    public ExpectedException unsuccessfulResponse = none(); 

    private WebResource resource; 

    @Before 
    public void setUp() { 
     Client client = Client.create(); 
     client.setFollowRedirects(false); 
     resource = client.resource("http://example.com"); 
    } 

    @Test 
    public void reportMovedPermanently() { 
     unsuccessfulResponse.expect(statusCode(MOVED_PERMANENTLY)); 

     resource.path("redirecting").get(String.class); 
    } 

    public static Matcher<UniformInterfaceException> statusCode(Status status) { 
     return new UniformInterfaceExceptionResponseStatusMatcher(status); 
    } 

} 

class UniformInterfaceExceptionResponseStatusMatcher extends TypeSafeMatcher<UniformInterfaceException> { 

    private final int statusCode; 

    public UniformInterfaceExceptionResponseStatusMatcher(Status status) { 
     this.statusCode = status.getStatusCode(); 
    } 

    public void describeTo(Description description) { 
     description.appendText("response with status ").appendValue(statusCode); 
    } 

    @Override 
    protected boolean matchesSafely(UniformInterfaceException exception) { 
     return exception.getResponse().getStatus() == statusCode; 
    } 

} 

還要注意,跟蹤重定向(在安裝方法)應該爲了得到而不是跟隨重定向UniformInterfaceException設置爲false(如果在位置標題中指定)。

相關問題