Mockito provides argument matchers and argument captors for flexibly stubbing or verifying method calls.
Mockito.verify()
, Mockito.when()
, Stubber.when()
and BDDMockito.given()
each have overloads
with and without argument matchers.
However, if argument matchers or captors are used only on some of the parameters, all the parameters need to have matchers as well, otherwise an
InvalidUseOfMatchersException
will be thrown.
This rule consequently raises an issue every time matchers are not used on all the parameters of a stubbed/verified method.
Noncompliant Code Example
@Test
public void myTest() {
given(foo.bar(anyInt(), i1, i2)).willReturn(null); // Noncompliant
when(foo.baz(eq(val1), val2)).thenReturn("hi"); // Noncompliant
doThrow(new RuntimeException()).when(foo).quux(intThat(x -> x >= 42), -1); // Noncompliant
verify(foo).bar(i1, anyInt(), i2); // Noncompliant
ArgumentCaptor<Integer> captor = ArgumentCaptor.forClass(Integer.class);
verify(foo).bar(captor.capture(), i1, any()); // Noncompliant
}
Compliant Solution
@Test
public void myTest() {
given(foo.bar(anyInt(), eq(i1), eq(i2))).willReturn(null);
when(foo.baz(val1, val2)).thenReturn("hi");
doThrow(new RuntimeException()).when(foo).quux(intThat(x -> x >= 42), eq(-1));
verify(foo).bar(eq(i1), anyInt(), eq(i2));
ArgumentCaptor<Integer> captor = ArgumentCaptor.forClass(Integer.class);
verify(foo).bar(captor.capture(), any(), any());
}
See
- Mockito documentation -
argument matchers
- {rule:java:S6068} - Call to Mockito method "verify", "when" or "given" should be simplified