2016-07-26 2 views
0

jersey-test-framework-grizzly2でJersey 1.19をテストする必要があります。ジャージーテスト - ExceptionMapper - HTTPステータスが200ではないUniformInterfaceException

public class ConfiguredMyServiceTest extends JerseyTest { 

    @Override 
    protected int getPort(int defaultPort) { 
     return 8080; 
    } 

    public static class AppConfig extends DefaultResourceConfig { 
     public AppConfig() { 
      getSingletons().add(new ExceptionMapperProvider()); 
      getSingletons().add(new MyService()); 
     } 
    } 

    @Override 
    public WebAppDescriptor configure() { 
     return new WebAppDescriptor.Builder() 
      .initParam(WebComponent.RESOURCE_CONFIG_CLASS, 
       AppConfig.class.getName()) 
       .build(); 
    } 
} 

HTTPステータス200を返すRESTエンドポイントを実行/テストすると、正常に動作します。

例外がスローされた場合、例外マッパーはそれをうまく処理し、フォームがエラーコードでオブジェクトjavax.ws.rs.core.Responseを返す:

@Provider 
@Singleton 
public class ExceptionMapperProvider implements ExceptionMapper<Exception>{ 

    @Override 
    public Response toResponse(final Exception exception){ 
     return Response.status(HttpStatusCodes.STATUS_CODE_SERVER_ERROR).entity(new BasicResponse(InternalStatus.UNHANDLED_EXCEPTION, exception.getMessage())).type(MediaType.APPLICATION_JSON).build(); 
    } 
} 

しかし、私は

com.sun.jersey.api.client.UniformInterfaceException: POST http://localhost:8080/v1/my-service/ returned a response status of 401 Unauthorized 

を取得私はJUnitテストでResponseを表明しようとしています。 UniformInterfaceExceptionの代わりにうまく形成された応答を得るにはどうすればいいですか?

+0

あなたはありますか401は認証できないため、すべての認証ハンドラが必要ですか?あなたの定数STATUS_CODE_SERVER_ERRORが評価するものはわかりませんが。これは実際に401ですか? –

+0

STATUS_CODE_SERVER_ERRORは500を意味します。私はSOのために簡略化して、一部の部品が削除されました。しかし、その401、500、または他のエラーコード、問題が同じかどうかは関係ありません。私がテストすると、ResponseではなくUniformInterfaceExceptionが返されます。 – Justas

+2

リクエスト/レスポンスを見ることができるように、ロギングフィルタを有効にすることをお勧めします。あなたがそれを一度も使ったことがないなら、ここをチェックしてくださいリクエストがあなたの休憩サービスに当たっていますか?次に、クライアント側でロギングフィルタを有効にする例を示します。 http://stackoverflow.com/questions/2332515/how-to-get-jersey-logs-at-server LoggingFilterコンストラクタでブール値のprintentityをtrueに設定することもできます。これは、401が実際にサーバーから来ていることを確認し、クライアント構成の問題ではないことを確認します。 –

答えて

0

protected ClientResponse executeGet(String path){ 
    WebResource resource = resource().path(path); 
    Builder builder = resource.header("Content-Type", "application/json;charset=UTF-8"); 
    return builder.get(ClientResponse.class); 
} 

をcom.sun.jersey.api.client.ClientResponseに変更予想されるクラスの型が今では様々なHTTPステータスを処理し、基本的な応答を解析することができます:

ClientResponse clientResponse = executeGet("/info"); 

if (clientResponse.getStatus() == 200) 
    CustomResponseType customResponse = clientResponse.getEntity(CustomResponseType.class); 
関連する問題