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

Tôi dự kiến ​​điều này sẽ in 1 2 nhưng thay vào đó in 2 2. Dường như lời kêu gọi '1' bị mất. Có cách nào để tôi có thể xác minh rằng xác minh đã xảy ra với 1 và sau đó 2?Mockito - xác minh riêng từng yêu cầu trên cùng một phương thức

Trả lời

14

Bạn có thể gọi ArgumentCaptor.getAllValues() thay vì getValue(). Điều này sẽ trả lại tất cả các giá trị đã chụp:

Trả về tất cả các giá trị đã chụp. Sử dụng nó khi chụp varargs hoặc khi phương thức đã xác minh được gọi nhiều lần.

Trong trường hợp này, nó sẽ trả lại List<String> chứa 12.

Phương pháp getValue() chỉ trả về giá trị bị bắt lần cuối:

Trả về giá trị bị bắt trong những cuộc tranh cãi.

Nếu phương pháp này được gọi là nhiều lần sau đó nó sẽ trả về giá trị mới nhất bắt

Trong code của bạn, bạn có thể thay atLeastOnce() với chính xác hơn times(2) kể từ khi mô hình được gọi là 2 lần. Bạn không cần phải có hai cuộc gọi riêng biệt để verify để nắm bắt các đối số: Mockito sẽ có thể nắm bắt tất cả các đối số được chuyển đến mô hình chỉ bằng một cuộc gọi.

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

Đổi thành getAllValues() từ getValues(). Nó sẽ trả về một danh sách tất cả các ảnh chụp mà nó thực hiện trên mô hình của bạn.

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

Những gì tôi thực sự cần thiết cuối cùng là trong trật tự xác minh để xác minh gia tăng, sử dụng các cuộc gọi() 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()); 
    } 
} 
Các vấn đề liên quan