How to verify that a method is not called on an object's dependency?
For example:
public interface Dependency {
void someMethod();
}
public class Foo {
public bar(final Dependency d) {
...
}
}
With the Foo test:
public class FooTest {
@Test
public void dependencyIsNotCalled() {
final Foo foo = new Foo(...);
final Dependency dependency = mock(Dependency.class);
foo.bar(dependency);
**// verify here that someMethod was not called??**
}
}
Even more meaningful :
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
// ...
verify(dependency, never()).someMethod();
The documentation of this feature is there §4 "Verifying exact number of invocations / at least x / never", and the never
javadoc is here.
Use the second argument on the Mockito.verify
method, as in:
Mockito.verify(dependency, Mockito.times(0)).someMethod()
never()
is not significantly more readable than times(0)
. But the existence of never
does increase cognitive load and makes the mockito system harder to understand and remember how to use. So really mockito shouldn't have included never
in their API, its not worth the mental cost.
someMethod
was called 0 times, or does it only verify that someMethod
was never called with zero arguments?
someMethod
with zero arguments was called zero times- not verified.
As a more general pattern to follow, I tend to use an @After
block in the test:
@After
public void after() {
verifyNoMoreInteractions(<your mock1>, <your mock2>...);
}
Then the test is free to verify only what should be called.
Also, I found that I often forgot to check for "no interactions", only to later discover that things were being called that shouldn't have been.
So I find this pattern useful for catching all unexpected calls that haven't specifically been verified.
verifyNoMoreInteractions
? The other answers here rely on the test writer explicitly remembering to list out these checks: that's too error prone in my book.
First of all: you should always import mockito static, this way the code will be much more readable (and intuitive):
import static org.mockito.Mockito.*;
There are actually many ways to achieve this, however it's (arguably) cleaner to use the
verify(yourMock, times(0)).someMethod();
method all over your tests, when on other Tests you use it to assert a certain amount of executions like this:
verify(yourMock, times(5)).someMethod();
Alternatives are:
verify(yourMock, never()).someMethod();
Alternatively - when you really want to make sure a certain mocked Object is actually NOT called at all - you can use:
verifyZeroInteractions(yourMock)
Please Note: verifyZeroInteractions(Object... mocks) is Deprecated. Since Version 3.0.1. The now recommended method is:
verifyNoInteractions(yourMock)
Both the verifyNoMoreInteractions()
and verifyZeroInteractions()
method internally have the same implementation as:
public static transient void verifyNoMoreInteractions(Object mocks[])
{
MOCKITO_CORE.verifyNoMoreInteractions(mocks);
}
public static transient void verifyZeroInteractions(Object mocks[])
{
MOCKITO_CORE.verifyNoMoreInteractions(mocks);
}
so we can use any one of them on mock object or array of mock objects to check that no methods have been called using mock objects.
Just as a suggestion, if you want to be more aligned at syntax level with Behavior-driven development style there is BDDMockito:
You could use:
then(dependency).should(never()).someMethod();
As an equivalent replacement of:
verify(dependency, never()).someMethod();
Success story sharing
never
is the best and most specific way, but if you need to check an entire mock object, also considerverifyZeroInteractions(mockObject)
orverifyNoMoreInteractions(mockObject)
.verifyZeroInteractions
has been deprecated.verifyNoInteractions
is the suggested a alternative. Mockito version at the time of this comment is 3.3.3