2013-10-23 2 views
12

Ich benutze die Groovy RESTClient Klasse, um einige (Spock) Akzeptanztests für Java WebServices zu schreiben, die ich geschrieben habe.Kann ich die Antwort von RESTClient "HttpResponseException" auf> 399 Rückgabecodes überschreiben?

Eine Frustration, die ich hatte, um die Antworten zu testen ...

200 Status ist einfach:

when: def result = callServiceWithValidParams() 
then: result.status == 200 

Aber mit 400+ Ich bin gezwungen, entweder wickeln in einem try-catch oder Test für die HttpResponseException, dass RESTClient standardmäßig wirft.

Das ist in Ordnung, wenn ein wenig frustrierend ... aber ich will es besser machen.

Idealerweise möchte ich meine Tests mehr ähneln diese (könnte verwirrend sein, wenn Sie nicht groovy/spock verwenden Sie)

@Unroll 
def "should return #statusCode '#status' Response"() 
{ 
    when: 
    def result = restClient.get(path: PATH, query: [param: parameter]) 

    then: 
    result.status == statusCode 

    where: 
    status   | statusCode | parameter     
    'OK'   | 200  | validParam 
    'Bad Request' | 400  | invalidParam 
} 

Im obigen Beispiel ist die 'Bad Request' Fall versagt . Statt einen Wert zurückzukehren, wirft restClient.get()HttpResponseException

+0

Es ist schwer zu verstehen, die Barriere Ihr Gesicht. Kannst du mehr Infos posten? Welcher Typ ist ein Param? Was passiert, wenn Sie versuchen, den Where-Block zum Definieren von Parametern zu verwenden? Wie sieht callService() aus? –

+0

@AlexBlakemore danke für die Antwort. Das Beispiel am Ende soll nur veranschaulichen, wie mir meine ursprüngliche Anfrage helfen könnte. Ich sehe jetzt, dass es etwas verwirrend ist, da ich den RESTClient nicht wirklich zeige. Stellen Sie sich 'callService (params)' als Wrapper um den Client vor, wobei die 'params' -Werte Maps von queryString-Parametern sind, die an den Service gesendet werden sollen. Das alles ist jedoch nicht wirklich wichtig.Der Hauptpunkt ist, dass der RESTService ein 'result' für 200 Antworten zurückgibt, aber einen Fehler für 400, 401, etc ... ausgibt. Daher kann ich die Antwort nicht standardmäßig in meinem 'then:' Block –

+0

bearbeiten Beispiel, um hoffentlich einfacher/klarer zu machen. –

Antwort

8

Da Tomasz bereits in einem Kommentar verlinkt ist, hier ist mein kleiner Einzeiler answer aus einer ähnlichen Frage.

client.handler.failure = client.handler.success 
1

Ein Ansatz eine Groovy bequeme Methode zu machen wäre, dass Ihre REST Anrufe Wraps, die Ausnahmen abfängt und verwandelt sie in Statuscodes

17

@JonPeterson kam mit dem, was ich denke, ist eine bessere Lösung, also gab ich his answer das Häkchen:

client.handler.failure = client.handler.success 

More info here


Die Lösung I (vorher) landeten auf:

restClient.handler.failure = { it } 

Welche Stenografie ist für

restClient.handler.failure = { resp -> return resp } 

@JimmyLuong in den Kommentaren darauf hingewiesen, dass dieser Ansatz die Daten aus dem Tropfen Antwort und schlug die folgende Verbesserung vor:

restClient.handler.failure = { resp, data -> resp.setData(data); return resp } 
+5

Die Verwendung dieser Lösung funktionierte gut, außer dass die Daten aus der Antwort gelöscht wurden. Um die Daten zu erhalten, musste ich folgendes tun: restClient.handler.failure = {resp, data -> resp. SetData (data); return resp} –

+0

Verwenden Sie diesen Ansatz: http://stackoverflow.com/a/29883754/411905, um die Daten zu lesen. –

+0

Der von @ TomaszKalkosiński vorgeschlagene Ansatz ist noch einfacher und wirkt wie ein Zauber – xverges

Verwandte Themen