gpt4 book ai didi

android - 在 Kotlin 中测试私有(private)方法

转载 作者:IT老高 更新时间:2023-10-28 13:42:58 26 4
gpt4 key购买 nike

如何在 Kotlin 中测试私有(private)方法?我尝试添加 @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)来自 androidx.annotation.VisibleForTesting但它不会使我的函数私有(private)

这就是我的使用方式

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

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

最佳答案

你可以使用java反射:

测试方法:

class ClassUnderTest {
private fun printGreetings(name: String): String {
return "Hello, $name"
}
}

够了:

  private val classUnderTest = spyk(ClassUnderTest()) 

@Test
fun `should return greetings`() {
val method = classUnderTest.javaClass.getDeclaredMethod("printGreetings", String::class.java)
method.isAccessible = true
val parameters = arrayOfNulls<Any>(1)
parameters[0] = "Piotr"

assertEquals("Hello, Piotr", method.invoke(classUnderTest, *parameters) )
}

关于android - 在 Kotlin 中测试私有(private)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52030607/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com