ScalaTest:注入隐式变量

ScalaTest : inject implicit variable

我来自 Java 背景,我正在尝试使用 Scala 编写单元测试。

我的class如下:

import com.softwaremill.sttp.{HttpURLConnectionBackend, Uri, sttp}

class MyClient(endpoint: String, principal: String) {

  private implicit val serialization = org.json4s.native.Serialization
  private implicit val backend = HttpURLConnectionBackend()

  def getDataSet(id: String) : Option[DataSet] = {
      //sttp.get(url).send <-- will use 'bakend'
  }
}

此处隐式变量'backend'用于插入 HTTP 客户端实现。

在 UnitTest 中我应该插入 SttpBackendStub .

implicit val testingBackend = SttpBackendStub.synchronous
        .whenRequestMatches(_.uri.path.startsWith("/dataSet"))
        .thenRespond(dataSetJson)

val client = new MyClient("http://dummy", "dummy")

然而,当我启动 MyClient 实例时,它仍然会使用 HttpURLConnectionBackend 而不是 SttpBackendStub

是否有在测试期间将 'testingBackend' 引入 MyClient 的解决方法?

这里隐式的使用让你觉得问题比实际情况更复杂。您直接在 MyClient 中实例化 HttpURLConnectionBackend,所以这就是您将要获得的 "backend"。如果您想使用不同的,则必须将其传递给 MyClient。您可以给它一个默认值以供生产使用,但在测试中实例化它时传入一个模拟。

class MyClient(endpoint: String, principal: String,
    implicit val backend: BackendInterface = HttpURLConnectionBackend) {

  private implicit val serialization = org.json4s.native.Serialization

  def getDataSet(id: String) : Option[DataSet] = {
      //sttp.get(url).send <-- will use 'bakend'
  }
}

在你的测试中:

val testingBackend = SttpBackendStub.synchronous
        .whenRequestMatches(_.uri.path.startsWith("/dataSet"))
        .thenRespond(dataSetJson)

val client = new MyClient("http://dummy", "dummy", testingBackend)