2016-02-10 11 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()); 
    } 
} 

mi aspettavo questo per stampare 1 2 ma esso stampa invece 2 2. Sembra che l'invocazione "1" sia persa. C'è un modo per verificare che le verifiche siano avvenute con 1 e poi con 2?Mockito - verificare separatamente molteplici invocazioni sullo stesso metodo

risposta

14

È possibile chiamare ArgumentCaptor.getAllValues() anziché getValue(). Ciò restituirà tutti i valori acquisiti:

Restituisce tutti i valori acquisiti. Usalo per catturare varargs o quando il metodo verificato è stato chiamato più volte.

In questo caso, verrà restituito un List<String> contenente 1 e 2.

Il metodo getValue() restituisce solo l'ultimo valore catturato:

Restituisce il valore catturato dell'argomento.

Se il metodo è stato chiamato più volte allora restituisce l'ultimo valore catturato

Nel codice, è possibile sostituire atLeastOnce() con la più precisa times(2) dal momento che il finto è stato chiamato 2 volte. Non è necessario avere due chiamate distinte a verify per acquisire gli argomenti: Mockito sarà in grado di acquisire tutti gli argomenti passati al mock con una sola chiamata.

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

Passa alla getAllValues() da getValues(). Restituirà una lista di tutte le catture che esegue sul tuo finto.

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

Quello che effettivamente necessarie alla fine sia in ordine verifica per la verifica incrementale, utilizzando le chiamate() 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()); 
    } 
} 
Problemi correlati