如何在Scala测试中模拟Dispatch http客户端?

aka*_*_sh 5 unit-testing scala mocking mockito scala-dispatch

我有一些处理HTTP请求的代码,我想对它进行单元测试.
因此,我正在尝试模拟dispatch.Http甚至更好的dispatch.HttpExecutor(0.8.5)与Scala(2.9.1.final),Mockito(1.9.0-rc1)和ScalaTest(1.6.1),但即使可以'让我的测试代码可编辑.
在MyHttpTest中,我希望收到任何HTTP请求的某些HTTP响应:

import org.scalatest.FunSuite
import org.scalatest.mock.MockitoSugar
import org.mockito.Mockito.when
import org.mockito.Matchers.any
import dispatch._

class MyHttpTest extends FunSuite with MockitoSugar {
  test("example") {
    val httpMock = mock[HttpExecutor]
    when(httpMock.apply(any(classOf[Handler[String]]))).thenReturn("Some_HTTP_response")
  }
}
Run Code Online (Sandbox Code Playgroud)

但它会产生编译错误:

error: overloaded method value thenReturn with alternatives:
(httpMock.HttpPackage[String],<repeated...>[httpMock.HttpPackage[String]])org.mockito.stubbing.OngoingStubbing[httpMock.HttpPackage[String]] <and>
(httpMock.HttpPackage[String])org.mockito.stubbing.OngoingStubbing[httpMock.HttpPackage[String]]
cannot be applied to (java.lang.String)
when(httpMock.apply(any(classOf[Handler[String]]))).thenReturn("Some_response")
Run Code Online (Sandbox Code Playgroud)

那么如何模拟调度客户端呢?

Pau*_*her 6

我打算回答这个问题,你应该尝试使用ScalaMock而不是Mockito,因为我错误地认为你遇到的问题是由Mockito引起的,而不是真正理解Scala(而ScalaMock是从ScalaMock开始创建的).然而:

  1. 这不是你的问题,而且
  2. 事实证明,ScalaMock在尝试模拟时失败,HttpExecutor因为它不知道如何处理包对象(ExceptionListener)中定义的类型.该死的!我会尽快解决它 - 感谢你引起我的注意.

无论如何,你不能创建一个实例,HttpExecutor#HttpPackage因为它是一个抽象类型.因此,为了解决这个问题,您需要扩展HttpExecutor并制定HttpPackage具体方案.例如:

class MyHttpTest extends FunSuite with MockitoSugar {
  trait TestHttpExecutor extends HttpExecutor {
    type HttpPackage[T] = T
  }
  test("example") {
    val httpMock = mock[TestHttpExecutor]
    when(httpMock.apply(any(classOf[Handler[String]]))).thenReturn("Some_HTTP_response")
  }
}
Run Code Online (Sandbox Code Playgroud)