scala:Moking我的scala对象有外部依赖

时间:2016-12-12 06:09:50

标签: scala unit-testing mocking apache-httpclient-4.x

我有一个像这样的对象:

// I want to test this Object
object MyObject {

  protected val retryHandler: HttpRequestRetryHandler = new HttpRequestRetryHandler {
    def retryRequest(exception: IOException, executionCount: Int, context: HttpContext): Boolean = {
      true // implementation
    }
  }

  private val connectionManager: PoolingHttpClientConnectionManager = new PoolingHttpClientConnectionManager
  val httpClient: CloseableHttpClient = HttpClients.custom
    .setConnectionManager(connectionManager)
    .setRetryHandler(retryHandler)
    .build

  def methodPost = {
    //create new context and new Post instance
    val post = new HttpPost("url")
    val res = httpClient.execute(post, HttpClientContext.create)
    // check response code and then take action based on response code
  }

  def methodPut = {
    // same as methodPost except use HttpPut instead HttpPost
  }

}

我想通过模拟像httpClient这样的依赖对象来测试这个对象。怎么做到这一点?我可以用Mokito或更好的方式吗?如是。怎么样?这个班级有更好的设计吗?

1 个答案:

答案 0 :(得分:0)

您的问题是:您创建了难以测试的代码。您可以转动here观看一些视频,了解原因。

简短的回答:在生产代码中直接调用 new 总是会让测试更加困难。您可能正在使用Mockito间谍(请参阅here了解其工作原理)。

但是:更好的答案是重做你的生产代码;例如,使用依赖注入。含义:不是创建类本身所需的对象(通过使用 new )...您的类从某处接收那些对象。

典型的(java)方法类似于:

public MyClass() { this ( new SomethingINeed() ); }

MyClass(SomethingINeed incoming) { this.somethign = incoming; }

换句话说:正常使用路径仍然直接调用 new ;但是对于单元测试,你提供了一个替代构造函数,你可以用它来注入你所测试的类所依赖的东西。