我有一个 Kotlin 项目,使用kotest作为我的单元测试框架和mockk来处理我的模拟需求。我对 Kotlin 语言的各个方面都很陌生,并且选择了测试库/框架。
我有一个简单的类,其中一个函数创建一个我想监视的对象。
import java.net.URI
class MyClass {
public fun doStuff() {
val uri = URI("https://some-random-endpoint.com/get/some/stuff")
// ...
// ...use URI object to get some stuff
// ...
}
}
我想监视 URI 对象的创建,以确保它通过了正确的端点。根据文档,我最初认为我可以像这样实现我的目标:
import io.kotest.core.spec.style.FunSpec
import io.kotest.matchers.shouldBe
import io.mockk.spyk
import java.net.URI
class MyClassTest : FunSpec({
test("doStuff should be targeting the correct endpoint") {
val urlSpy = spyk<URI>()
val myClass: MyClass = MyClass()
myClass.doStuff()
urlSpy.host shouldBe "some-random-endpoint.com"
urlSpy.path shouldBe "/get/some/stuff"
}
})
但是,这会失败,因为两者urlSpy.host
和urlSpy.path
are null
。
我显然误解了一些东西。我怀疑我希望的幕后魔术不是将我的间谍与在MyClass.doStuff()
如果我用 a 替换我的间谍,mockk
那么 URI 对象的创建将被模拟,正如我所期望的那样。但是,在这种情况下,模拟对我来说似乎不是正确的对象......我不想模拟行为,我只想验证编码的行为。
我哪里错了?