2011-12-14 31 views
55

tôi có phương pháp sau đây mà tôi muốn xác minh hành vi trênLàm thế nào để xác minh nhiều phương pháp gọi với params khác nhau

public void methodToTest(Exception e, ActionErrors errors) { 

    ... 
     errors.add("exception.message", 
        ActionMessageFactory.createErrorMessage(e.toString())); 

     errors.add("exception.detail", 
        ActionMessageFactory.createErrorMessage(e.getStackTrace()[0].toString())); 

    ... 
} 

Trong lớp @Test của tôi, tôi đã hy vọng để làm một cái gì đó như thế này để xác minh rằng errors.add() được gọi là với "exception.message" và một lần nữa với "exception.detail"

verify(errors).add(eq("exception.message"), any(ActionError.class)); 
verify(errors).add(eq("exception.detail"), any(ActionError.class)); 

tuy nhiên Mockito phàn nàn như sau

Argument(s) are different! Wanted: 
actionErrors.add(
    "exception.message", 
    <any> 
); 

Actual invocation has different arguments: 
actionErrors.add(
    "exception.detail", 
    [email protected] 
); 

Làm thế nào tôi có thể yêu cầu Mockito kiểm tra cả hai giá trị?

+0

khi u có 2 phương pháp có chữ ký khác nhau, bạn có thể viết trường hợp kiểm tra riêng biệt cho cả hai. –

+1

Có, nhưng trong trường hợp này chữ ký của phương thức giống nhau nhưng chỉ có các giá trị đối số khác nhau – Brad

Trả lời

55

Đọc thêm đã dẫn tôi đến thử sử dụng ArgumentCaptors và các công trình sau đây, mặc dù nhiều hơn nữa tiết hơn tôi mong muốn.

ArgumentCaptor<String> argument = ArgumentCaptor.forClass(String.class); 

verify(errors, atLeastOnce()).add(argument.capture(), any(ActionMessage.class)); 

List<String> values = argument.getAllValues(); 

assertTrue(values.contains("exception.message")); 
assertTrue(values.contains("exception.detail")); 
17

Hãy thử một cái gì đó như thế này:

verify(errors, times(2)) 
    .add(AdditionalMatchers.or(eq("exception.message"), eq("exception.detail")), 
      any(ActionError.class)); 
14

bạn có thể có một vấn đề trong mã của bạn. Bởi vì thực tế là bạn thực sự viết mã này:

Map<Character, String> map = mock(Map.class); 

map.put('a', "a"); 
map.put('b', "b"); 
map.put('c', "c"); 

verify(map).put(eq('c'), anyString()); 
verify(map).put(eq('a'), anyString()); 
verify(map).put(eq('b'), anyString()); 

Lưu ý xác minh đầu tiên thậm chí không theo thứ tự liên quan đến lời gọi thực tế.

Ngoài ra, tôi khuyên bạn nên thực sự không chế nhạo các loại bạn không sở hữu, ví dụ: kiểu thanh chống.

[EDIT @Brad]

Sau khi chạy mã Brice của (ở trên) trong IDE của tôi, tôi có thể thấy rằng tôi đã sử dụng ActionError thay vì ActionMessage, vì vậy đó là lý do tại sao tôi xác minh() đã không phù hợp. Thông báo lỗi tôi đăng lúc đầu đã gây hiểu nhầm cho tôi khi nghĩ rằng đó là đối số đầu tiên không phù hợp. Hóa ra đó là đối số thứ hai.

Vì vậy, câu trả lời cho câu hỏi của tôi là

/** 
* note that ActionMessageFactory.createErrorMessage() returns ActionMessage 
* and ActionError extends ActionMessage 
*/ 
verify(errors).add(eq("exception.message"), any(ActionMessage.class)); 
verify(errors).add(eq("exception.detail"), any(ActionMessage.class)); 
+0

Không nhận được những gì bạn đang cố gắng nói. Thứ tự xác minh có quan trọng không? nếu lệnh xác minh có vấn đề. Tại sao sau đó ở đây là Api InOrder được cung cấp? –

+0

Giống như những gì được viết ở trên để xác minh là không liên quan; đó là lý do tại sao có 'InOrder'. – Brice

31

Nếu thứ tự của cả hai add() cuộc gọi là có liên quan, bạn có thể sử dụng InOrder:

InOrder inOrder = inOrder(errors, errors); 
inOrder.verify(errors).add(eq("exception.message"), any(ActionError.class)); 
inOrder.verify(errors).add(eq("exception.detail"), any(ActionError.class)); 
+0

Đây là câu trả lời chính xác, hiện đại. – Lambart

+1

Đủ để vượt qua đối số 'lỗi' duy nhất: ' InOrder inOrder = inOrder (lỗi); '(xem [tài liệu] (http://javadoc.io/page/org.mockito/mockito-core/latest/org /mockito/Mockito.html#in_order_verification)) – GreenhouseVeg

3

Bạn có thể sử dụng Mockito.atLeastOnce() cho phép Mockito để vượt qua các thử nghiệm ngay cả khi mockObject sẽ được gọi nhiều lần.

Mockito.verify(mockObject, Mockito.atLeastOnce()).testMethod(Mockito.eq(1)); 

Mockito.verify(mockObject, Mockito.atLeastOnce()).testMethod(Mockito.eq(2)); 
Các vấn đề liên quan