2013-05-05 3 views
1

Я пытаюсь написать тест, который перенаправляет stdout основного метода, но кажется, что как только я вызываю main, он, кажется, начинается с другого потока, и я не могу захватить вывод. Вот код:Redirect stdout в другом потоке

Это работает:

val baos = new ByteArrayOutputStream 
val ps = new PrintStream(baos) 
System.setOut(ps) 
print("123") 
Assert.assertEquals("123", baos.toString) 

Это не:

val baos = new ByteArrayOutputStream 
val ps = new PrintStream(baos) 
System.setOut(ps) 
GameRunner.main(_) 
Assert.assertEquals("123", baos.toString) 

....

object GameRunner { 
    def main(args: Array[String]) { 
     print("123") 

Как я могу поймать вызов print в мой тест?

* Я также попытался scala.Console.setOut

EDIT

Я заметил, что работает GameRunner.main(_) даже не перечислить что-либо в консоли, когда я не перенаправляет. Чем это вызвано?

ответ

2

print действительно Predef.print, который вызывает Console.print. Даже если вы звоните System.setOut, я не знаю, оказывает ли это влияние на Console.print. Попробуйте позвонить Console.setOut или попробовать:

Console.withOut(ps)(GameRunner.main(null)) 

Другая возможность состоит в том, что с помощью вызова GameRunner.main (_) вы ничего не выполняется (как это может быть, это просто возвращение функции (args: Array[String]) => GameRunner.main(args) должно быть быстрым, чтобы исключить это?. . из

Edit Yep:.

scala> object A { def main(args: Array[String]) { println("1") } } 
defined module A 
scala> A.main(null) 
1 
scala> A.main(_) 
res1: Array[String] => Unit = <function1> 
+0

Как я редактировал, 'Console.setOut' не работает, однако,' Console.withOut' работал –

+0

справа, на втором счете, тоже только я вызов с основным (null) вместо main (_), тогда он работает. Я думал, что это сработает, потому что я не использую аргументы ... Мне нужно будет понять это дальше :) Большое спасибо! –

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