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??**
}
}
7 Answers 7
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.
6 Comments
never is the best and most specific way, but if you need to check an entire mock object, also consider verifyZeroInteractions(mockObject) or verifyNoMoreInteractions(mockObject).verifyZeroInteractions has been deprecated. verifyNoInteractions is the suggested a alternative. Mockito version at the time of this comment is 3.3.3Use the second argument on the Mockito.verify method, as in:
Mockito.verify(dependency, Mockito.times(0)).someMethod()
5 Comments
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.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)
Comments
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.
5 Comments
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.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.
1 Comment
Couple of options to do that depending on the use case.
If you want to verify that someMethod is not invoked on dependency use below
verify(dependency, times(0)).someMethod();
or much better readable option
verify(dependency, never()).someMethod();
If you want that no interaction on specific dependency to happen, then use below.
verifyNoInteractions(dependency);
If there are multiple methods on a dependency and you want to make sure only expected method is invoked and nothing else. Then use
verify(dependency, times(1)).someMethod();
verifyNoMoreInteractions(dependency);
Comments
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();
Comments
Explore related questions
See similar questions with these tags.