如何正确模拟将在 init 块中使用的属性?

Mar*_*k D 6 junit android mockito kotlin mockk

class A当我们在测试中创建一个新的值时,它会初始化我们的值,并且在init块中将值传递给class B,只有在值获取器被模拟之后。

主要问题是我想将模拟值传递给 init block 中的 B 类

为什么我需要那个?

假设class A实现了一些由使用这些 Val 的内部逻辑触发的回调class B,我们需要测试这些类之间的契约。

class A(
    private val b: B
) {

    val val1: SomeVal = SomeVal()
    val val2: SomeVal = SomeVal()

    init {
        b.setVals(val1, val2)
    }
    
    fun doSomeWork() {
        b.doAnotherWork()
    }
}

classB {

    private lateinit var val1: SomeVal
    private lateinit var val2: SomeVal

    fun setVals(a: SomeVal, b: SomeVal>) {
         val1 = a
         val2 = b
    }

    fun doAnotherWork(): Int {
         return val1.SomeInt + val2.SomeInt
    }
}

class ATest {
    
    private lateinit var a: A
    private lateinit var val1: SomeVal
    private lateinit var val2: SomeVal     

    @Before
    fun setup() {
        val b = mockk<B>()

        a = spyk(A(b))

        val1 = mockk(relaxed = true)
        val2 = mockk(relaxed = true)
    
        every { a.val1 } returns val1
        every { a.val2 } returns val2
    }

    @Test
    fun test() {
        every { val1.SomeInt } returns 4
        every { val2.SomeInt } returns 6

        *someAssertion*
    }
}
Run Code Online (Sandbox Code Playgroud)