web-dev-qa-db-ja.com

Kotlinでプライベートメソッドをテストする

Kotlinでプライベートメソッドをテストする方法は? _androidx.annotation.VisibleForTesting_から@VisibleForTesting(otherwise = 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
    }
}
_

残念ながら、テストのためにプライベート関数fun read(bufferedReader: BufferedReader): List<String>を呼び出す必要があります。なぜなら、Fileをモックするとき、_file.bufferedReader_はNullPointerExceptionjunit のBufferedWriterクラスのモック

7
qbait

oneこれに対する答えのみがあります。試してはいけません。

intentと通信するソースコードを記述します。 privateを作成する場合、それは内部実装の詳細です。次の秒は変更される可能性があります。