2016-02-10 2 views
10
import static org.mockito.Mockito.atLeastOnce; 
import static org.mockito.Mockito.verify; 

import org.mockito.ArgumentCaptor; 
import org.mockito.Mockito; 


public class MockitoTest { 


    public static class TestMock { 
     public void doIt(String s) { 
     } 
    } 

    public static void main(String[] args) { 
     TestMock mock = Mockito.mock(TestMock.class); 
     mock.doIt("1"); 
     mock.doIt("2"); 

     ArgumentCaptor<String> argument = ArgumentCaptor.forClass(String.class); 
     verify(mock, atLeastOnce()).doIt(argument.capture()); 
     System.out.println(argument.getValue()); 
     verify(mock, atLeastOnce()).doIt(argument.capture()); 
     System.out.println(argument.getValue()); 
    } 
} 

Я ожидал, что это напечатать 1 2, но вместо этого он печатает 2 2. Кажется, что вызов «1» потерян. Есть ли способ проверить, что проверки произошли с 1, а затем 2?Mockito - отдельно проверки нескольких вызовов на том же методе

ответ

14

Вы можете позвонить по телефону ArgumentCaptor.getAllValues() вместо getValue(). Это вернет все зафиксированные значения:

Возвращает все полученные значения. Используйте его при захвате varargs или когда вызванный метод вызывается несколько раз.

В этом случае он будет возвращать List<String> содержащий 1 и 2.

Метод getValue() только возвращает последнее захваченное значение:

Возвращает захваченное значение аргумента.

Если метод вызывается несколько раз, то он возвращает последнее значение, Захваченные

В вашем коде, вы можете заменить atLeastOnce() с более точным times(2), так как макет был назван в 2 раза. Вам не нужно иметь два разных вызова verify, чтобы захватить аргументы: Mockito сможет захватить все аргументы, переданные макету одним вызовом.

TestMock mock = Mockito.mock(TestMock.class); 
mock.doIt("1"); 
mock.doIt("2"); 

ArgumentCaptor<String> argument = ArgumentCaptor.forClass(String.class); 
verify(mock, times(2)).doIt(argument.capture()); // verify that it was call 2 times and capture the values given 

System.out.println(argument.getAllValues()); 
2

Переключить на getAllValues() от getValues(). Он вернет список всех захватов, которые он выполняет на ваш макет.

ArgumentCaptor<String> argument = ArgumentCaptor.forClass(String.class); 
verify(mock, atLeastOnce()).doIt(argument.capture()); 
System.out.println(argument.getAllValues().get(0)); 
verify(mock, atLeastOnce()).doIt(argument.capture()); 
System.out.println(argument.getAllValues().get(1)); 
1

То, что я на самом деле нужен, в конце концов был в заказ проверкой для дополнительных проверок, с помощью вызовов() VerificationMode

public static class A { 

    public void a(int x) {} 

    public void b() {} 

} 

public static void main(String[] args) { 
    A a = mock(A.class); 
    a.b(); 
    a.a(1); 
    a.a(1); 
    a.a(2); 
    a.a(3); 
    a.a(4); 

    InOrder inOrder = Mockito.inOrder(a); 
    // Verifies [1,1] 
    inOrder.verify(a, calls(2)).a(1); 
    { 
     // Verifies [2] 
     ArgumentCaptor<Integer> argument = ArgumentCaptor.forClass(Integer.class); 
     inOrder.verify(a, calls(1)).a(argument.capture()); 
     System.out.println(argument.getAllValues()); 
    } 
    { 
     // Verifies [3,4] 
     ArgumentCaptor<Integer> argument = ArgumentCaptor.forClass(Integer.class); 
     inOrder.verify(a, calls(2)).a(argument.capture()); 
     System.out.println(argument.getAllValues()); 
    } 
} 
Смежные вопросы