2013-10-23 9 views
12

Sto usando la classe Groovy RESTClient per scrivere alcuni test di accettazione (spock) per i servizi Web Java che ho creato.È possibile sostituire la risposta predefinita "HttpResponseException" di RESTClient a> 399 Codici restituiti?

Una frustrazione che ho avuto è in fase di test le risposte ...

200 di Stato sono facili:

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

Ma con 400+ devo per forza o avvolgere in un try-catch, o il test per il HttpResponseException che il numero RESTClient viene generato di default.

when: 
    callWithInvalidParams() 
then: 
    def e = thrown(Exception) 
    e.message == 'Bad Request' 

Questo è un po 'ok, anche se un po' frustrante ... ma voglio fare meglio.

Idealmente, voglio che i miei test a più assomigliano a questo (potrebbe essere fonte di confusione se non si utilizza Groovy/spock)

@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 
} 

Nell'esempio precedente, il caso 'Bad Request' fallisce . Invece di restituire un valore, restClient.get() tiri HttpResponseException

+0

È difficile capire la barriera che si ha di fronte. Puoi pubblicare più informazioni? Che tipo sono i parametri? Cosa succede quando provi a usare il blocco where per definire i parametri? Come si presenta callService()? –

+0

@AlexBlakemore grazie per la risposta. L'esempio alla fine ha lo scopo di illustrare come la mia richiesta originale potrebbe aiutarmi. Ora vedo che è un po 'confuso, perché in realtà non mostro RESTClient. Pensa a 'callService (params)' come un wrapper attorno al client dove i valori di 'params' sono mappe di parametri queryString da inviare al servizio. Tutto ciò non è davvero importante però.Il punto principale è che RESTService restituisce un 'result' per 200 risposte, ma genera un errore per 400, 401, ecc ... quindi non posso testare la risposta in un modo standard nel mio' then: 'block –

+0

Just editted the esempio per renderlo più semplice/chiaro. –

risposta

8

Come Tomasz ha già collegato in un commento, ecco la mia piccola linea answer da una domanda simile.

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

Un approccio potrebbe essere quello di fare un metodo comodo Groovy che avvolge le chiamate REST che cattura le eccezioni e le trasforma in codici di stato

17

@JonPeterson si avvicinò con quello che penso è una soluzione migliore, così ho dato his answer il segno di spunta:

client.handler.failure = client.handler.success 

More info here


La soluzione I (in precedenza) atterrato su:

restClient.handler.failure = { it } 

Quale è una scorciatoia per

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

@JimmyLuong notare nei commenti che questo approccio scende i dati del risposta e suggerito il seguente miglioramento:

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

L'utilizzo di questa soluzione per me ha funzionato bene, ad eccezione dei dati eliminati dalla risposta. Per ottenere i dati, dovevo fare qualcosa come: restClient.handler.failure = {resp, data -> resp.setData (data); return resp} –

+0

Utilizzare questo approccio: http://stackoverflow.com/a/29883754/411905 per leggere i dati. –

+0

L'approccio suggerito da @ TomaszKalkosiński è ancora più semplice e funziona come un incantesimo – xverges

Problemi correlati