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

问题描述

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

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

我为什么需要那个?

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

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*
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)