我有一个关于mockk的问题,想知道我在哪里设置错了。下面是我代码片段。
// my unit test
val myObject = spyk<Manager>()
// Define behavior for the property
val mockOK = mockk<Result>()
every { mockOK.id } returns "aaa"
every { mockOK.status } returns SessionStatus.OK
every { mockOK.timestamp } returns 123
every { mockOK.isValid() } returns true
every { myObject.ok } returns mockOK
// Use the mocked property
val result = myObject.ok
assertEquals("aaa", result.id) // this is good
assertEquals(true, result.isValid()) // this is good.
val actual = myObject.getResult()
assertEquals("aaa",actual.id) //this failed
// my class
class Manager{
var ok : Result = Result()
var notOk: Result = Result()
fun getResult() = if (ok.isValid()) { ok } else notOk
}
我能够在myObject
中正确地模拟它,但当我调用getResult()
时,它应该返回示例变量ok
,就像myObject.ok
一样,但它没有按预期返回。我得到了一个不同的对象。我有正确设置mockk吗?
2条答案
按热度按时间omhiaaxx1#
您可以直接从getResult()调用返回mockOk
我还建议重新格式化测试的样式,以便更具可读性。让我知道这是否解决了你的问题:)
fgw7neuy2#
看起来在mock-spy中只用初始化器来模拟属性是不起作用的。有几种方法可以解决这个问题:
选项1:可以用函数替换
ok
或者像这样添加getter和setter
这样,出于某种原因,间谍将返回
getResult
中的模拟ok
值。选项二:您打算创建一个部分模拟,其中
ok
模拟,getResult
调用原始代码。您可以使用mock,而不是使用间谍:这样,模拟的
ok
值也将被getResult
的原始实现所获取。选项3:当
ok
是一个公共可变属性时,为什么要通过mocking来更改它的值?你也可以用赋值来设置它: