2016-11-07 4 views
0

Основной вопрос, я хочу, чтобы стандартный ввод был конкретной строкой. В настоящее время я пытаюсь его с этим:Как переопределить stdin на строку

import java.nio.charset.StandardCharsets 
import java.io.ByteArrayInputStream 
// Let's say we are inside a method now 
val str = "textinputgoeshere" 
System.setIn(new ByteArrayInputStream(str.getBytes(StandardCharsets.UTF_8))) 

Потому что подобно тому, как я хотел бы сделать это в Java, однако str.getBytes, кажется, работает по-разному в Scala как система в устанавливается на адрес памяти, когда я проверяю он с Println ....

Я посмотрел на Scala API: http://www.scala-lang.org/api/current/scala/Console $ .html # setIn (в: java.io.InputStream): Unit и я нашел

def withIn[T](in: InputStream)(thunk: ⇒ T): T 

Но это, по-видимому, только устанавливает поток ввода для определенного фрагмента кода, я бы хотел это будет функцией метода установки в моих тестах JUnit.

+0

У Scala есть небольшая неприязнь к побочным эффектам, и эта является довольно жестокой - можете ли вы также передать входной поток в метод, который вы тестируете? – Reactormonk

+0

Выглядит как дубликат: http://stackoverflow.com/questions/40344117/create-user-prompt-and-simulate-interaction/40350178 – tkachuko

ответ

1

Моя проблема оказалась чем-то связанным с моим кодом, а не с этой конкретной концепцией. Правильный способ переопределения стандартного In/System В строку в Scala является следующее:

val str = "your string here" 
val in: InputStream = new ByteArrayInputStream(str.getBytes(StandardCharsets.UTF_8)) 
Console.withIn(in)(yourMethod())" 

Мои тесты правильно работать в настоящее время.

+0

Также эта тема освещена в [официальном файле scala.Console] (http: /www.scala-lang.org/api/current/scala/Console$.html) где можно использовать java.io.StringReader в качестве источника ввода 'val input = new StringReader (s" $ {customStrInput} \ n ")' или содержимое файла 'val input: Reader = openFile (" file.txt ")' для 'Console.withIn (input) {...}' –

Смежные вопросы