ScalaTest:注入隐式变量

cqoc49vn  于 8个月前  发布在  Scala
关注(0)|答案(1)|浏览(62)

我来自Java背景,我正在尝试使用Scala编写UnitTests。
我的班级如下:

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中的解决方法?

vuv7lop3

vuv7lop31#

这里使用implicit是让你认为问题比实际情况更复杂。您直接在MyClient中示例化HttpURLConnectionBackend,因此这就是您将获得的“后端”。如果你想使用一个不同的,你必须把它传递给MyClient。您可以给予它一个默认值以供生产使用,但在测试中示例化它时传递一个mock。

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)

相关问题