拼接方法

时间:2015-08-02 13:33:32

标签: scala unit-testing

我有一个HTTP请求生成器,我想创建单元测试,以避免执行实际调用(主要是为了验证请求结构)。
我的班级是这样的:

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

嘲笑A. 但createRequestAndExec不应该是公共API的一部分..

1 个答案:

答案 0 :(得分: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): ??? = {...}
}

您可以实施所有请求生成逻辑&测试它,而不用担心它是如何路由的。这种将复杂对象分解为小部分的模式允许您更容易地推理和测试每个模块。这使您可以在将代码组合成更大的单元时信任它。

以下是将RequestBuilderHttpClient组合成当前Requestor课程的示例:

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

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

   ... etc

}