Andreas_D Andreas_D - 7 days ago 5
Java Question

Mockito - how to verify that a mock was never invoked

I'm looking for a way to verify with Mockito, that there wasn't any interaction with a given mock during a test. It's easy to achieve that for a given method with verification mode

never()
, but I haven't found a solution for the complete mock yet.

What I actually want to achieve: verify in tests, that nothing get's printed to the console. The general idea with jUnit goes like that:

private PrintStream systemOut;

@Before
public void setUp() {
// spy on System.out
systemOut = spy(System.out);
}

@After
public void tearDown() {
verify(systemOut, never()); // <-- that doesn't work, just shows the intention
}


A
PrintStream
has tons of methods and I really don't want to verify each and every one with separate verify - and the same for
System.err
...

So I hope, if there's an easy solution, that I can, given that I have a good test coverage, force the software engineers (and myself) to remove their (my) debug code like
System.out.println("Breakpoint#1");
or
e.printStacktrace();
prior to committing changes.

Answer

Use this :

import static org.mockito.Mockito.verifyZeroInteractions;

// ...

private PrintStream backup = System.out;

@Before
public void setUp() {
    System.setOut(mock(PrintStream.class));
}

@After
public void tearDown() {
    verifyZeroInteractions(System.out);
    System.setOut(backup);
}