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)
我来自 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)