2013-05-05 177 views
1

我想寫一個測試,將重定向的主要方法stdout,但似乎一旦我調用主,它似乎開始在另一個線程,我無法捕獲輸出。下面是代碼:重定向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

編輯

我也注意到,運行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)要快快的裁決? 。出

編輯沒錯:

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'工作 – 2013-05-05 02:59:02

+0

右鍵,在第二個帳戶,也有一次,我使用main(null)而不是main(_)調用,然後運行,我猜我曾以爲這會採取類似行動,因爲我不使用參數...我將不得不進一步瞭解這一點:)非常感謝! – 2013-05-05 03:01:18