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()); 
    } 
} 

पर कई आमंत्रण की पुष्टि करने मैं इस उम्मीद 1 2 मुद्रित करने के लिए, लेकिन यह बजाय 2 2 प्रिंट करता है। ऐसा लगता है कि '1' आमंत्रण खो गया है। क्या कोई तरीका है कि मैं सत्यापित कर सकता हूं कि सत्यापन 1 और फिर 2 के साथ हुआ?Mockito - अलग से एक ही विधि

उत्तर

14

आप getValue() के बजाय ArgumentCaptor.getAllValues() पर कॉल कर सकते हैं। यह सभी कब्जे वाले मूल्यों को वापस कर देगा:

सभी कैप्चर किए गए मान लौटाता है। Varargs को कैप्चर करते समय या सत्यापित विधि को कई बार बुलाया जाने पर इसका उपयोग करें।

इस मामले में, यह एक List<String> युक्त 1 और 2 वापस आ जाएगी।

तर्क का कब्जा मान देता है:

getValue() विधि केवल पिछले कब्जा कर लिया मान देता है।

तो विधि कई बार बुलाया गया था तो यह नवीनतम पर कब्जा कर लिया मान देता है

अपने कोड में, आप अधिक सटीक times(2) साथ atLeastOnce() जगह ले सकता है के बाद से नकली 2 बार बुलाया गया था। तर्कों को पकड़ने के लिए आपको verify पर दो अलग-अलग कॉल करने की आवश्यकता नहीं है: मॉकिटो केवल एक कॉल के साथ नकली में दिए गए सभी तर्कों को कैप्चर करने में सक्षम होगा।

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

getValues() से getAllValues() में स्विच करें। यह आपके मॉक पर किए गए सभी कैप्चर की एक सूची वापस कर देगा।

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()); 
    } 
} 
संबंधित मुद्दे