Mockito - how to mock/verify a method call which accepts a new object?

后端 未结 1 1184
无人共我
无人共我 2021-01-28 01:51

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

相关标签:
1条回答
  • 2021-01-28 02:43

    You have a few options:

    1. 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").

    2. 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.

    3. 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());
        }
      
    0 讨论(0)
提交回复
热议问题