Java 测试控制台输出
有一个关于测试控制台输出的问题 标准输出类:Java 测试控制台输出,java,testing,junit,Java,Testing,Junit,有一个关于测试控制台输出的问题 标准输出类: public abstract class StdOutTest { private final PrintStream stdOutMock = mock(PrintStream.class); private final PrintStream stdOutOrig = System.out; @Before public void setUp() { System.setOut(this.st
public abstract class StdOutTest {
private final PrintStream stdOutMock = mock(PrintStream.class);
private final PrintStream stdOutOrig = System.out;
@Before
public void setUp() {
System.setOut(this.stdOutMock);
}
@After
public void tearDown() {
System.setOut(this.stdOutOrig);
}
protected final PrintStream getStdOutMock() {
return this.stdOutMock;
}
}
现在有件事我不明白:
public class test extends StdOutTest{
@Before
public void setUp(){
//empty
}
@Test
public void example(){
System.out.println("hello");
verify(getStdOutMock()).println("hello");
}
}
我使用Mockito进行验证,当我删除setUp()时,该测试通过,但在setUp()中失败。失败消息显示:
hello
Wanted but not invoked:
printStream.println("hello");
-> at observer_test.test.example(test.java:18)
Actually, there were zero interactions with this mock.
有人能帮我解释一下为什么会发生这种情况吗?您的子类正在用一个空方法覆盖超类的
setUp
方法。您可以通过添加对超类方法的调用来解决此问题:
@Before
public void setUp(){
super.setUp();
}
或者,如果不需要在子类it中执行任何自定义设置,您可以删除子类it中的
设置方法。您没有调用系统.setOut
来附加模拟。