2012-02-01 14 views
7

Próbuję dowiedzieć się, jak napisać moje przypadki testowe dla usługi, którą zamierzam napisać.Groovy HTTPBuilder Kpiący z odpowiedzi

Usługa będzie używać HTTPBuilder do żądania odpowiedzi z jakiegoś adresu URL. Żądanie HTTPBuilder musi tylko sprawdzić odpowiedź na sukces lub niepowodzenie. Realizacja usługi będzie być coś tak prostego jak:

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

Tak, chcę, aby móc mock HTTPBuilder tak, że mogę ustawić reakcję być albo sukces/porażka w moim teście, więc mogę stwierdzić, że Metoda mojej usługi: isOk zwraca wartość Prawda, gdy odpowiedź jest udana i Fałsz, gdy odpowiedź jest niepowodzeniem.

Czy ktoś może pomóc, jak mogę sfałszować żądanie HTTPBuilder i ustawić odpowiedź w GroovyTestCase?

Odpowiedz

10

Oto minimalne przykładem modelowej HttpBuilder które będą obsługiwać swój przypadek testowy:

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

Jeśli pole result jest prawdą, będzie to wywołać zamknięcie success, inaczej failure.

EDIT: Oto przykład przy użyciu MockFor zamiast mock klasy:

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

Dzięki za odpowiedź. Nie rozumiem, co ustawi "wynik" na true/false. Czy nie jest to bardziej jak kikut niż makieta? – C0deAttack

+0

Musisz ustawić wynik samodzielnie podczas konfiguracji testu. Na przykład. 'nowy MockHttpBuilder (wynik: true)'. Dodałem alternatywę, która wykorzystuje szydercze kpiny. – ataylor

+0

Odpowiedź Ataylora jest dobra, wprowadziłem prawie taką samą implementację, z tą różnicą, że ustawiłem bezpośrednio stan odpowiedzi, a następnie użyłem go do wykonania prawidłowego zamknięcia z mapowania. Jest to jednak naprawdę kpiąco. Myślę, że właściwym podejściem jest kpić z klienta, który daje odpowiedź. – Gepsens