Groovy HTTPBuilder издевается над клиентом

Этот вопрос тесно связан с этим вопросом. Разница в том, что я хотел бы следовать рекомендуемому подходу к издевательству над клиентом. Итак, у меня определен следующий HTTPBuilder:

protected readUrl() {
    def http = new HTTPBuilder("http://example.com")
    def status = http.request(Method.GET, ContentType.JSON) {req ->
        response.success = {resp, json ->
            result = json.toString()
            new Success<String>(result)
        }
        response.'401' = {resp ->
            final String errMsg = "Not Authorized"
            new Failed(Failable.Fail.ACCESS_DENIED, errMsg)
        }
        response.failure = {resp ->
            final String errMsg = "General failure ${resp.statusLine}"
            new Failed(Failable.Fail.UNKNOWN, errMsg)
        }
    }
}

Что я хотел бы сделать, так это найти способ модульного тестирования этого блока кода. Я хотел издеваться над ответом, чтобы я мог специально установить коды ответов, если это возможно. Может ли кто-нибудь показать мне способ сделать это?


person Michael D Johnson    schedule 21.09.2012    source источник
comment
На самом деле я закодировал это, издеваясь над HTTPBuilder, но мне все же хотелось бы посмотреть, как выглядит издевательство над клиентом.   -  person Michael D Johnson    schedule 22.09.2012
comment
что вы подразумеваете под издевательством над клиентом?   -  person Michael Easter    schedule 22.09.2012
comment
Что-то вроде этого: groovyconsole.appspot.com/script/760001 Просто установите этот макет на свой сервис. .   -  person Raphael    schedule 24.09.2012
comment
@Майкл, я не уверен, каким должен быть клиент. Было упомянуто, что издевательство над клиентом было лучшим подходом в вопросе, на который я ссылался, однако я также не знал, что означает плакат.   -  person Michael D Johnson    schedule 25.09.2012
comment
@ Рафаэль Спасибо. Я издевался над своим решением по-другому, но ваш пример кода выглядит намного проще, чем мое решение. Самой большой проблемой, с которой я столкнулся, была возможность проверить пути для разных кодов ответов. Ваш образец, кажется, решил эту проблему.   -  person Michael D Johnson    schedule 25.09.2012
comment
Можете ли вы опубликовать ответ и принять его? Так что другие не будут тратить время на просмотр этой закрытой темы.   -  person    schedule 26.09.2012
comment
@Raphael, если вы опубликуете свой комментарий в ответ, я приму его.   -  person Michael D Johnson    schedule 26.09.2012


Ответы (1)


Это мое предпочтительное решение:

class MockHTTPBuilder{
    MockHTTPBuilder(string){}
    MockHTTPBuilder(){}
    def pleaseFail = false
    def mockData = []
    def request(a, b, c){
        if(pleaseFail) [status:'500',data: mockData ?: "It failed :("]
        else [status:'200',data: mockData ?: "Yay :)"]
    }
}

Вот несколько примеров использования: http://groovyconsole.appspot.com/script/760001.

В качестве альтернативы вы можете метапрограммировать фактический экземпляр httpClient и заставить его вести себя так, как ожидалось (принудительно сбой или прохождение во время тестирования), но это немного сложнее.

person Raphael    schedule 28.09.2012