gpt4 book ai didi

java - 使用仅适用于第一次测试的流进行单元测试日志

转载 作者:行者123 更新时间:2023-12-02 04:14:10 25 4
gpt4 key购买 nike

我有一个 JUnit 测试类,它使用 Mockito,我需要在其中测试某些内容是否正确记录。它基本上看起来像这样:

public class MyTest {

private final PrintStream outDefault = System.out;
private final PrintStream errDefault = System.err;

private final ByteArrayOutputStream outContent = new ByteArrayOutputStream();
private final ByteArrayOutputStream errContent = new ByteArrayOutputStream();

@Before
public void setUp() {
System.setOut(new PrintStream(outContent));
System.setErr(new PrintStream(errContent));
}

@After
public void tearDown() {
System.setOut(outDefault);
System.setErr(errDefault);
}

@Test
public void Test1_Condition_Expected() {
assertTrue(errContent.toString().toLowerCase().contains("..."));
}

...

@Test
public void TestN_Condition_Expected() {
assertTrue(errContent.toString().toLowerCase().contains("..."));
}
}

我也尝试过在 @After 中对流进行刷新和关闭,但它似乎也不起作用:

@After
public void tearDown() {
try {
outContent.flush();
errContent.flush();
outContent.close();
errContent.close();
} catch (IOException e) {
e.printStackTrace();
}

System.setOut(outDefault);
System.setErr(errDefault);
}

当我运行整个类(class)时,第一个测试通过了,但其余的没有通过。如果我一项一项地运行测试,那么它们都会通过。

我已经调试了代码,一切似乎都正常工作,但是对于第一个测试之外的测试,流没有获取日志,所以显然它们失败了。

最佳答案

请注意,您要刷新的 ByteArrayOutputStreams:

outContent.flush();
errContent.flush();

...不是您正在设置的 PrintStreams:

System.setOut(new PrintStream(outContent));
System.setErr(new PrintStream(errContent));

...还有 PrintStream owns a BufferedWritercan be set to auto-flush, but doesn't do so by default :

Optionally, a PrintStream can be created so as to flush automatically; this means that the flush method is automatically invoked after a byte array is written, one of the println methods is invoked, or a newline character or byte ('\n') is written.

我的猜测是,在每次针对 toString() 的断言之前需要刷新的是 PrintStream,而不是 ByteArrayOutputStream。

关于java - 使用仅适用于第一次测试的流进行单元测试日志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33495986/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com