[java] Mockito可以捕獲多次調用方法的參數嗎?


1 Answers

由於Mockito 2.0還有可能使用靜態方法Matchers.argThat(ArgumentMatcher) 。 在Java 8的幫助下,它現在更清晰,更易讀:

verify(mockBar).doSth(argThat((arg) -> arg.getSurname().equals("OneSurname")));
verify(mockBar).doSth(argThat((arg) -> arg.getSurname().equals("AnotherSurname")));

如果你被綁定到較低的Java版本,那也不是那麼糟糕:

verify(mockBar).doSth(argThat(new ArgumentMatcher<Employee>() {
        @Override
        public boolean matches(Object emp) {
            return ((Employee) emp).getSurname().equals("SomeSurname");
        }
    }));

當然,這些都不能驗證呼叫的順序 - 您應該使用InOrder

InOrder inOrder = inOrder(mockBar);

inOrder.verify(mockBar).doSth(argThat((arg) -> arg.getSurname().equals("FirstSurname")));
inOrder.verify(mockBar).doSth(argThat((arg) -> arg.getSurname().equals("SecondSurname")));

請看看mockito-java8項目,它可以進行如下調用:

verify(mockBar).doSth(assertArg(arg -> assertThat(arg.getSurname()).isEqualTo("Surname")));
Question

我有一個被調用兩次的方法,我想捕獲第二個方法調用的參數。

以下是我所嘗試的:

ArgumentCaptor<Foo> firstFooCaptor = ArgumentCaptor.forClass(Foo.class);
ArgumentCaptor<Foo> secondFooCaptor = ArgumentCaptor.forClass(Foo.class);
verify(mockBar).doSomething(firstFooCaptor.capture());
verify(mockBar).doSomething(secondFooCaptor.capture());
// then do some assertions on secondFooCaptor.getValue()

但是我得到一個TooManyActualInvocations異常,因為Mockito認為doSomething只能被調用一次。

我如何驗證doSomething的第二次調用的參數?




您也可以使用@Captor註釋的ArgumentCaptor。 例如:

@Mock
List<String> mockedList;

@Captor
ArgumentCaptor<String> argCaptor;

@Test
public void shouldCallAddMethodTwice() {
    mockedList.add("one");
    mockedList.add("two");
    Mockito.verify(mockedList, times(2)).add(argCaptor.capture());

    assertEquals("one", argCaptor.getAllValues().get(0));
    assertEquals("two", argCaptor.getAllValues().get(1));
}



Related