2012-02-01 14 views
7

Sto cercando di capire come scrivere i miei casi di test per un servizio che sto per scrivere.Groovy HTTPBuilder che deride la risposta

Il servizio utilizzerà HTTPBuilder per richiedere una risposta da alcuni URL. La richiesta HTTPBuilder deve solo controllare la risposta per un successo o un fallimento. L'implementazione del servizio sarà essere qualcosa di semplice come:

boolean isOk() { 
    httpBuilder.request(GET) { 
     response.success = { return true } 
     response.failure = { return false } 
    } 
} 

Quindi, voglio essere in grado di prendere in giro il HTTPBuilder in modo da poter impostare la risposta a essere sia successo/insuccesso nel mio test in modo da poter affermare che Il metodo isOk del mio servizio restituisce True quando la risposta è positiva e False, quando la risposta è un errore.

Qualcuno può aiutare con come posso prendere in giro la richiesta HTTPBuilder e impostare la risposta in un GroovyTestCase?

risposta

10

Ecco un esempio minimale di un mock HttpBuilder che gestirà il vostro banco di prova:

class MockHttpBuilder { 
    def result 
    def requestDelegate = [response: [:]] 

    def request(Method method, Closure body) { 
     body.delegate = requestDelegate 
     body.call() 
     if (result) 
      requestDelegate.response.success() 
     else 
      requestDelegate.response.failure() 
    } 
} 

Se il campo result è vero, sarà invocano la chiusura success, altrimenti failure.

EDIT: Ecco un esempio di utilizzo MockFor al posto di una classe finta:

import groovy.mock.interceptor.MockFor 

def requestDelegate = [response: [:]] 
def mock = new MockFor(HttpBuilder) 
mock.demand.request { Method method, Closure body -> 
    body.delegate = requestDelegate 
    body.call() 
    requestDelegate.response.success() // or failure depending on what's being tested 
} 
mock.use { 
    assert isOk() == true 
} 
+0

Grazie per la risposta. Non capisco cosa imposterà 'risultato' su vero/falso. Inoltre non è più simile a un mozzicone di un finto? – C0deAttack

+0

È necessario impostare il risultato da soli quando si imposta il test. Per esempio. 'new MockHttpBuilder (result: true)'. Ho aggiunto un'alternativa che usa il mocking groovy. – ataylor

+0

La risposta di Ataylor è buona, mi è venuta quasi la stessa implementazione, tranne che ho impostato direttamente lo stato della risposta e quindi l'ho utilizzato per eseguire la chiusura corretta dalla mappatura. Comunque questo è veramente Stub beffardo. Penso che l'approccio corretto sia quello di deridere il cliente che dà la risposta. – Gepsens

Problemi correlati