如何在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.bufferedReader
给NullPointerException
Unable to mock BufferedWriter class in junit
对此只有一个答案:甚至不尝试。
您编写源代码来传达意图。如果你做了一些private
那么东西是一个内部实现细节。它可能会在下一秒发生变化。