2013-08-26 52 views
0

我在寫一個調用代碼的JUnit測試用例,最終導致調用native函數調用。下面是測試的僞代碼,我想寫:在Java代碼中捕獲本地STDOUT寫入

@Test 
public void testNoWritesToStdOut() { 
    x = new StdOutTrap(); 
    x.startTrappingStdOut(); 
    try { 
     callTheFunctionUnderTest(); // Nothing should be written to stdout 
     assertEquals("", x.capturedOutput()); 
    } finally { 
     x.stopTrappingStdOut(); 
    } 
} 

注意到callTheFuntionUnderTest()調用native代碼,這可能是C代碼,如:

... 
printf("fail\n"); 

或C++代碼,如:

... 
std::cout << "fail" << std::endl; 

爲了清晰起見,我不想通過System.setOut將呼叫重定向到System.out.X到定製PrintStream。我想獲得在執行native調用期間被寫入stdout標準流的字節的副本(如果有的話),我無法控制該字節。

想法?

回答

0

如果你想從本地代碼捕獲輸出,你不能單獨在JVM中做這件事,但需要操作系統來幫助你。

您必須在單獨的JVM中調用您的測試,並且您必須要求操作系統爲您捕獲輸出。在shell中運行進程的常用方式可能是您需要的。