MockK 的 spyk 如何覆盖构造函数?

Bie*_*bar 2 unit-testing mocking kotlin mockk

我目前尝试将一个类测试为通常在构造函数中初始化数据库连接的间谍对象。该类的简化版本如下所示。

class classToTest(){
    val connection:Connection

    init {
        connection = DatabaseConnection(url="127.0.0.1")
    }

    fun methodA():Int{
       return 3
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我尝试以下列方式(简化)测试我的 classToTest 的方法。

class TestClass(){
    var connection = mockk<DatabaseConnection>()
    var dbh = spyk(ClassToTest())

    @Test
    fun testMethodA(){
       assertEquals(dbh.methodA,3)
    }
}
Run Code Online (Sandbox Code Playgroud)

现在的问题是我的测试无法启动,因为我不知道如何覆盖可能使用连接模拟而不是初始化连接对象的 init 函数。感谢帮助。

And*_*ann 5

我认为没有办法模拟间谍的 init 功能。

我建议您使用构造函数来传递连接的实例。

class ClassToTest(val connection: Connection) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后在您的测试中模拟连接非常容易。

class TestClass(){
    private val dbh = ClassToTest(mockk())

    @Test
    fun testMethodA() {
       assertEquals(dbh.methodA, 3)
    }
}
Run Code Online (Sandbox Code Playgroud)