2016-07-26 20 views
0

Ich muss Jersey 1.19 mit Jersey-Test-Framework-Grizzly2 testen. Es gibt Konfigurationsklasse mit registrierten REST-Endpunkt und Ausnahme-Mapper-Klasse:Jersey Test - ExceptionMapper - UniformInterfaceException wenn der HTTP-Status nicht 200 ist

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

Wenn ich ausführen/Test-REST-Endpunkt, den HTTP-Status 200 zurück, es funktioniert gut.

Wenn Ausnahme ausgelöst wird, Ausnahme Mapper behandelt sie gut und Formen zurückgeben Objekt javax.ws.rs.core.Response mit Fehlercode:

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

Allerdings bekomme ich

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

wenn Ich versuche die Antwort in meinen JUnit-Tests zu bestätigen. Wie bekomme ich eine wohlgeformte Antwort anstelle von UniformInterfaceException?

+0

Haben Sie irgendwelche Authentifizierungshandler vorhanden, weil 401 bedeutet, dass Sie sich nicht authentifizieren können? Ich weiß zwar nicht, was Ihre Konstante STATUS_CODE_SERVER_ERROR auswertet. Ist das eigentlich ein 401? –

+0

STATUS_CODE_SERVER_ERROR bedeutet 500. Ich habe ExceptionMapper für SO so vereinfacht, dass einige Teile entfernt wurden. Es ist jedoch egal, ob es 401, 500 oder ein anderer Fehlercode ist, das Problem ist das gleiche - wenn ich es teste, bekomme ich UniformInterfaceException statt Response. – Justas

+2

Ich würde empfehlen, Protokollierungsfilter zu aktivieren, so dass Sie die Anfrage/Antwort sehen können. Überprüfen Sie hier, ob Sie es noch nie benutzt haben. Sehen Sie, dass die Anfrage Ihren Restdienst betrifft? Hier finden Sie ein Beispiel für das Aktivieren des Protokollierungsfilters auf der Clientseite. http://stackoverflow.com/questions/2332515/how-to-get-jersey-logs-at-server Sie können auch die boolesche Eigenschaft im LoggingFilter-Konstruktor auf true setzen. Dies stellt sicher, dass der 401 tatsächlich vom Server kommt und kein Problem mit der Client-Konfiguration ist. –

Antwort

0

Changed erwartete Klassentyp

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

Jetzt com.sun.jersey.api.client.ClientResponse ist es in der Lage verschiedenen HTTP-Status zu handhaben und die darunter liegende Antwort analysieren:

ClientResponse clientResponse = executeGet("/info"); 

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