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
来附加模拟。