2

Jersey クライアントを使用して、サービスに対していくつかの統合テストを実行しています。ただし、私の呼び出しの 1 つがリダイレクトを送信します。リダイレクトを取得することを期待していますが、Jersey Client がリダイレクトを取得すると、com.sun.jersey.api.client.UniformInterfaceException でエラーが発生します。リダイレクトで応答を受け入れ、何が得られたかを知らせる方法はありますか?

4

1 に答える 1

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 を取得するには、リダイレクトに従う (setUp メソッド内) を false に設定する必要があることに注意してください。

于 2013-07-12T10:42:21.217 に答える