gpt4 book ai didi

java - Junit 测试控制台中的输出

转载 作者:行者123 更新时间:2023-11-30 05:26:27 25 4
gpt4 key购买 nike

我仍然找不到以下方法的测试方法失败的原因。

public static void print() {
System.out.println("hello");
}

我的Junit测试方法如下

@Test
public void testPrint(){
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream ps = new PrintStream(baos);

PrintStream old = System.out;

System.setOut(ps);

//execute the above method
obj.print();

System.out.flush();
System.setOut(old);

//test method
String expected = "hello" + "\n";
assertEquals(expected, baos.toString());
}

AssertionFailed 预期错误:<hello but was <hello>

所以问题应该出在换行符上。有谁知道如何解决吗?

最佳答案

像这样编写测试是使用模拟的好地方:

// code with Mockito
@Test
public void testPrint(){
PrintStream mockedPrintStream = Mockito.mock(PrintStream.class);
PrintStream old = System.out;
System.setOut(mockedPrintStream);

obj.print();

Mockito.verify(mockedPrintStream).println("hello");

System.setOut(old); // add this line when edit
}

现在您检查是否使用参数调用了方法。

有关模拟的更多信息,请参阅 Mockito manual

<小时/>

编辑 - 回答评论中的问题

PrintStream old = System.out; 您需要此行,因为在 System.out 中是外部代码,测试后您应该清理您所使用的所有对象的状态测试过程中污染。

在大多数情况下,这种清理发生在@TearDown方法中,或者只是因为当@Test方法返回时GC删除了对象。

在这种情况下,您需要在测试方法中手动执行此操作,因为没有其他地方可以将 System.out 属性的状态恢复到测试之前的状态。

关于java - Junit 测试控制台中的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58490355/

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