Тестирование частных методов в Котлине - PullRequest
0 голосов
/ 27 августа 2018

Как проверить приватные методы в Kotlin?Я пытался добавить @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) из androidx.annotation.VisibleForTesting, но это не делает мою функцию приватной

Вот как я ее использую

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

[EDIT]

Я понимаю, что не должен тестировать 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 Невозможно смоделировать класс BufferedWriter в junit

1 Ответ

0 голосов
/ 28 августа 2018

Существует только один ответ на этот вопрос: даже не пытайтесь.

Вы пишете исходный код для связи намерение .Если вы делаете что-то private, то это что-то внутреннее в реализации.Это может быть изменено в следующую секунду.

...