I have a method (method1) that I\'d like to test, which based on parameters provided creates an object and calls another method (method2). So I\'m mocking method2, which accepts
You have a few options:
Implement equals
and hashCode
on SampleObj
. Because you didn't wrap fooList
in a matcher, Mockito checks with List.equals
, which checks equals
for corresponding objects in each List. The default behavior of Object.equals is that a.equals(b)
iff a == b
--that is, objects are equal iff they refer to the same instance--but you're welcome to override that if every SampleObj("foobar") equals every other SampleObj("foobar").
Use a Hamcrest Matcher you write.
private static Matcher<List<SampleObj>> isAListWithObjs(String... strings) {
return new AbstractMatcher<List<SampleObj>>() {
@Override public boolean matches(Object object) {
// return true if object is a list of SampleObj corresponding to strings
}
};
}
// in your test
verify(mockedAnotherService).method2(argThat(isAnObjListWith("another param")));
Note that you could also just make a Matcher of a single SampleObj, and then use a Hamcrest wrapper like hasItem
. See more matchers here.
Use a Captor to check equals
your own way:
public class YourTest {
// Populated with MockitoAnnotations.initMocks(this).
// You can also use ArgumentCaptor.forClass(...), but with generics trouble.
@Captor ArgumentCaptor<List<SampleObj>> sampleObjListCaptor;
@Test public void testMethod1() {
// ...
verify(mockedAnotherService).method2(sampleObjListCaptor.capture());
List<SampleObj> sampleObjList = sampleObjListCaptor.getValue();
assertEquals(1, sampleObjList.size());
assertEquals("another param", sampleObjList.get(0).getTitle());
}