繁体   English   中英

模拟一个构造函数并返回一个模拟对象而不是带有 mockk 的真实对象

[英]Mock a constructor and return a mocked object instead of real object with mockk

我对一个我想测试的类提出了挑战,但在该类内部将创建其他对象。

这个简单的例子说明了这个问题。

class A {
    val b: B
    init() {
      b = B()
    }
}

这只是一个例子,我知道依赖注入会有所帮助。 但在现实生活中,这是一个非常复杂的类,不能轻易改变。

我的想法是使用mockkConstructor 但这不是诀窍。

fun `test construction`() {
    mockkConstructor(B::class)
    every { anyConstructed<B>() } returns mockk<B>()

    val a = A()
}

不幸的是,它无法编译。 错误:每个 {...} 块内都缺少模拟调用:确保块内的对象是模拟

我这样试过

fun `test construction`() {
    mockkConstructor(B::class)
    every { A() } returns mockk<B>()

    val a = A()
}

但是这样它在A的init方法中调用了A的真实构造函数,也调用了B的真实构造函数。

有谁知道是否有可能以这种方式或类似方式解决它?

所以我对这些示例类进行了测试:

class A {
    val b: B
    init {
        b = B()
    }
}
class B {
    fun getA(): String {
        return "B"
    }
}

测试:

@Test
fun test() {
    mockkConstructor(A::class)
    val b = mockk<B>()
    every { anyConstructed<A>().b } returns b
    every { b.getA() } returns "MOCKK"

    val a = A()

    Assert.assertEquals("MOCKK", a.b.getA())
}

在调用mockkConstructor(B::class)已经使B的构造函数返回由anyConstructed<B>()表示的原型模拟之后,您尝试模拟B()以返回B的模拟是完全多余的。

这意味着,您只需要anyConstructed<B>()来指定对该模拟的调用行为,例如

every { anyConstructed<B>().someFunctionCall() } returns 1

有关更多详细信息,请参阅MockK 文档:构造函数模拟

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM