2016-10-24 10 views
6

Tôi đang cố xác minh rằng lớp tôi đang thử nghiệm gọi phương thức của lớp phụ thuộc chính xác. Vì vậy, tôi đang cố gắng để phù hợp với các thông số phương pháp, nhưng tôi không thực sự quan tâm đến các giá trị thực tế trong thử nghiệm này, bởi vì tôi không muốn làm cho thử nghiệm của tôi giòn.Cách đối sánh một tham số null có thể có trong Mockito

Tuy nhiên, tôi đang chạy vào rắc rối cài đặt nó lên vì Mockito đã quyết định rằng hành vi của tôi đang mong đợi là một lỗi: https://github.com/mockito/mockito/issues/134

Vì vậy what't cách chính xác để xác định một Matcher cho một tham số mà có thể là null?

Với sự cố # 134 "cố định", mã này không thành công do đối sánh chỉ khớp trong trường hợp đầu tiên. Làm thế nào tôi có thể xác định một matcher để làm việc trong tất cả 4 trường hợp?

MyClass c = mock(MyClass.class); 

c.foo("hello", "world"); 
c.foo("hello", null); 
c.foo(null, "world"); 
c.foo(null, null); 

verify(c, times(4)).foo(anyString(), anyString()); 

Trả lời

1

tôi để làm việc này bằng cách chuyển sang any(String.class)

Tôi tìm thấy điều này một chút sai lầm, bởi vì các API dường như cho thấy anyString() chỉ là một bí danh cho any(String.class) ít nhất cho đến bản cập nhật 2.0. Để công bằng, tài liệu hướng dẫn chỉ định rằng anyString() chỉ khớp với các chuỗi không phải null. Nó có vẻ phản trực giác với tôi.

+0

Đây có vẻ là câu trả lời đúng từ Mockito 2.0 trở đi. Trong các phiên bản của Mockito trước 2.0, mã ban đầu của bạn sử dụng 'anyString()' sẽ có tác dụng, nhưng đây là một thay đổi đột phá mà nhóm Mockito đã giới thiệu với 2.0. –

+1

Thao tác này không hoạt động nữa. Từ tài liệu - '' 'Vì Mockito 2.1.0 phương pháp này sẽ thực hiện kiểm tra kiểu do đó null giá trị không được ủy quyền''' –

-1

Làm thế nào về:

verify(c, times(4)).foo(anyObject(), anyObject()); 

Điều đó phù hợp với bạn?

Matchers.anyObject() cho phép null s.

tham khảo trong Mockito docs:

+0

Không, bởi vì sau đó IDE của tôi phàn nàn rằng 'foo (String, String)' có thể không được viện dẫn bởi 'foo (Object, Đối tượng) ' – gridDragon

+0

Có thể bạn chỉ cần sử dụng kiểu chụp' any() 'nhưng' anyObject' trả về 'Object' và do đó không thể làm việc. –

11

Từ javadocs của any()

Kể từ Mockito 2.1.0, chỉ cho phép không null String. Vì điều này là tham chiếu không thể thực hiện, nên API được đề xuất đến khớp với null trình bao bọc sẽ là isNull(). Chúng tôi cảm thấy sự thay đổi này sẽ làm cho các thử nghiệm khai thác an toàn hơn nhiều với Mockito 1.x.

Vì vậy, cách để phù hợp với đối số chuỗi nullable là tuyên bố rõ ràng:

nullable(String.class) 
+0

Cảm ơn bạn! Huyền thoại. – prijupaul

Các vấn đề liên quan