捕获Java代码中的本机STDOUT写入

时间:2013-08-26 20:34:13

标签: java stream stdout native-code

我正在编写一个JUnit测试用例,该测试用例调用最终导致调用native函数调用的代码。这是我想写的测试的伪代码:

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

注意callTheFuntionUnderTest()调用可能是C代码的native代码,如:

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

或C ++代码,如:

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

为清楚起见,我不想通过System.out.X将来自PrintStream的来电重定向到自定义System.setOut。我想得到一个字节的副本,如果有的话,在stdout调用执行期间写入native标准流,我无法控制。

想法?

1 个答案:

答案 0 :(得分:0)

如果要从本机代码捕获输出,则不能仅在JVM中执行此操作,而是需要操作系统来帮助您。

您必须在单独的JVM中调用测试,并且必须要求操作系统为您捕获输出。在shell中运行进程的常用方法可能就是您所需要的。