在Kotlin中测试私有方法

问题描述 投票:6回答:1

如何在Kotlin中测试私有方法?我试图从@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)添加androidx.annotation.VisibleForTesting,但它不会使我的功能私有化

这就是我使用它的方式

@VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
fun doSomething() {}

[编辑]

我明白我不应该测试private方法,但它现在总是微不足道的。下面的案例怎么样

我有一个CsvReader类

class CsvReader(private val inputStream: InputStream, private val separator: String = "\t") {
    fun read(): List<String> {
        return read(inputStream.bufferedReader())
    }
    private fun read(bufferedReader: BufferedReader): List<String> {
        val line = bufferedReader.use { it.readLine() } // `use` is like try-with-resources in Java
        return parse(line)
    }
    private fun parse(line: String): List<String> {
        return line.split(separator)
    }
}

我为它编写了测试

class CsvReaderTest {
    private val stream = mock<InputStream>()
    private val reader = CsvReader(stream)
    private val bufferedReader = mock<BufferedReader>()
    @Test
    fun read() {
        whenever(bufferedReader.readLine()).thenReturn("Jakub\tSzwiec")
        reader.read(bufferedReader) shouldEqual listOf("Jakub", "Szwiec")
    }
    @Test
    fun readWhenEmpty() {
        whenever(bufferedReader.readLine()).thenReturn("")
        reader.read(bufferedReader) shouldEqual listOf("")
    }
    @Test
    fun throwIOExceptionWhenReadingProblems() {
        whenever(bufferedReader.readLine()).thenThrow(IOException::class.java)
        val read = { reader.read(bufferedReader) }
        read shouldThrow IOException::class
    }
}

不幸的是,对于测试我需要调用私有函数fun read(bufferedReader: BufferedReader): List<String>,因为当模拟File时,file.bufferedReaderNullPointerException Unable to mock BufferedWriter class in junit

android kotlin tdd private
1个回答
2
投票

对此只有一个答案:甚至不尝试。

您编写源代码来传达意图。如果你做了一些private那么东西是一个内部实现细节。它可能会在下一秒发生变化。

© www.soinside.com 2019 - 2024. All rights reserved.