kotlin mock不获取pick up mock

yi0zb3m4  于 2023-05-18  发布在  Kotlin
关注(0)|答案(2)|浏览(233)

我有一个关于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吗?

omhiaaxx

omhiaaxx1#

您可以直接从getResult()调用返回mockOk

// given this data
every { myObject.getResult() } returns mockOK

val expected = "aaa"

// when this happens in the code
val actualId = myObject.getResult().id

// then this is expected
assertThat(actualId).isEqualTo(expected)

我还建议重新格式化测试的样式,以便更具可读性。让我知道这是否解决了你的问题:)

fgw7neuy

fgw7neuy2#

看起来在mock-spy中只用初始化器来模拟属性是不起作用的。有几种方法可以解决这个问题:

选项1:可以用函数替换ok

fun ok(): Result = Result()

或者像这样添加getter和setter

var ok: Result = Result()
    get() { return field }
    set(value) { field = value }

这样,出于某种原因,间谍将返回getResult中的模拟ok值。

选项二:您打算创建一个部分模拟,其中ok模拟,getResult调用原始代码。您可以使用mock,而不是使用间谍:

val myObject = mockk<Manager> {
    every { ok } returns mockOK
    every { getResult() } answers { callOriginal() }
}

这样,模拟的ok值也将被getResult的原始实现所获取。

选项3:当ok是一个公共可变属性时,为什么要通过mocking来更改它的值?你也可以用赋值来设置它:

myObject.ok = mockOK

相关问题