Как проверить код, который использует readline (System`in`) в kotlin? - PullRequest
0 голосов
/ 03 мая 2020

Как проверить код в kotlin, который выполняет readline, как показано ниже:

import org.junit.jupiter.api.*
import org.junit.jupiter.api.Assertions.*
import java.io.*
fun foo() {
    val string="a b\nc d"
    var bais: ByteArrayInputStream=string.byteInputStream()
    val bis=BufferedInputStream(bais)
    //var l=bis.readLine() // no readline!
    // program uses just readline()
    var br: BufferedReader =BufferedReader(InputStreamReader(bais))
    var l=br.readLine()
    println(l) // works file
    val si=System.`in`
    println("System.`in` is ${si::class.simpleName}") // says it's a BufferedInputStream
}
fun main() {
    foo()
}
@TestInstance(TestInstance.Lifecycle.PER_CLASS) internal class T1KtTestCase {
    @Test fun testFoo() {
        // ?
    }
}

1 Ответ

0 голосов
/ 04 мая 2020

Вы можете добавить inputStream и outputStream в качестве аргументов вашей функции foo:

fun foo(inputStream: InputStream, outputStream: OutputStream) {
    val name = BufferedReader(InputStreamReader(inputStream)).readLine()
    PrintStream(outputStream).println("Hello, ${name.trim()}!")
}

fun main() {
    foo(System.`in`, System.out)
}

И затем вы можете проверить свою функцию foo следующим образом:

class Test {

    @Test
    fun testFoo() {
        val inputStream = "username".byteInputStream()
        val outputStream = ByteArrayOutputStream()
        foo(inputStream, outputStream)
        assertEquals(String(outputStream.toByteArray()), "Hello, username!\n")
    }

}
...