2016-07-26 70 views
0

我必須使用jersey-test-framework-grizzly2測試Jersey 1.19。有配置類與註冊的REST端點和異常映射類:Jersey狀態測試 - ExceptionMapper - UniformInterfaceException當HTTP狀態不是200

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.我簡化了ExceptionMapper,所以有些部分被刪除。但是,如果它的401,500或其他錯誤代碼沒有問題,問題是相同的 - 當我測試時,我得到UniformInterfaceException而不是Response。 – Justas

+2

我會建議啓用日誌過濾器,以便您可以看到請求/響應。如果您從未使用過,請點擊此處。你看到請求打你的休息服務嗎?以下是在客戶端啓用日誌過濾器的示例。 http://stackoverflow.com/questions/2332515/how-to-get-jersey-logs-at-server您也可能想要在LoggingFilter構造函數中將布爾printentity設置爲true。這將驗證401實際上來自服務器,而不是客戶端配置的問題。 –

回答

0

更改預期類類型com.sun.jersey.api.client.ClientResponse

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); 
} 

現在它能夠處理各種HTTP狀態和分析基礎響應:

ClientResponse clientResponse = executeGet("/info"); 

if (clientResponse.getStatus() == 200) 
    CustomResponseType customResponse = clientResponse.getEntity(CustomResponseType.class);