2015-08-02 5 views
0

У меня есть генератор запросов HTTP, и я хотел бы создать модульные тесты, которые не позволяют выполнять фактические вызовы (в основном для проверки структуры запроса).
Мой класс что-то вроде:Методы stubbing

class Requestor {   
    def get (params : Map[String, String]) = { 
     process("GET", params) 
    } 
    def post(params : Map[String, String]) = { 
     process("POST", params) 
    } 
    private def process(s: String, p : Map[String, String]) = { 
     val res = createRequestAndExec(s, p) 
     doStuffToReposnse(res) 
    } 
    private createRequestAndExec(s: String, p : Map[String, String]) = { 
     // create apache HTTPBaseRequest 
     .. 
     // execute request using apache DefaultHttpClient 
    } 
} 

Могу ли я каким-то образом гася этот метод? Если я использовать MockFactory (если я правильно понимаю) я должен создать черту быть высмеивали, который будет выглядеть как

trait A { 
    def post .. 
    def get ... 
    def createRequestAndExec ... 
} 

И издеваться но createRequestAndExec не должна быть частью публичного API ..

ответ

0

Вы объединяете генератор запросов с отправителем запроса. Тот факт, что ваш метод называется createRequest*And*Exec, является предупреждением о том, что он, вероятно, слишком много работает. Если вы должны были иметь два типа, а не один, как это:

trait RequestBuilder { 
    def get(params: Map[String, String]): HTTPBaseRequest = {...} 
    def post(params: Map[String, String]): HTTPBaseRequest = {...} 
} 

trait HttpClient { 
    def sendRequest(req: HTTPBaseRequest): ??? = {...} 
} 

Вы можете реализовать все ваши запроса логики поколения & тест него никогда не заботясь о том, как он направляется. Такая схема разложения сложных объектов на мелкие части позволяет вам легко обосновать и протестировать каждый модуль. Это позволяет доверять вашему коду, когда он состоит из более крупных блоков.

Вот пример составления RequestBuilder и HttpClient вместе в текущий Requestor класс:

class Requestor(requestBuilder: RequestBuilder, client: HttpClient) { 

    def sendGet(params: Map[String, String]) = { 
     client.sendRequest(requestBuilder.get(params)) 
    } 

    ... etc 

}