Mockito.any () vượt qua Giao diện với Generics


170

Có thể vượt qua loại giao diện với generic?

Giao diện:

public interface AsyncCallback<T>

Trong phương pháp thử nghiệm của tôi:

Mockito.any(AsyncCallback.class)

Đặt <ResponseX>phía sau hoặc cho không .classlàm việc.

Câu trả lời:


306

Có một cách an toàn loại: sử dụng ArgumentMatchers.any()và đủ điều kiện với loại:

ArgumentMatchers.<AsyncCallback<ResponseX>>any()

4
Tôi xác nhận câu trả lời này hoạt động và ngăn chặn chính xác cảnh báo.
kevinarpe

1
Điều này thực sự không an toàn hơn vì phương thức thực tế chỉ có thể được gọi với đối số được gõ chính xác. Nó chỉ cần thiết để đáp ứng trình biên dịch tiền java8 thiếu loại suy luận kiểu này.
herman 17/12/14

Tôi đã sử dụng một cái gì đó giống như FeedbackEntity <List <Map <String, Object >>> answerEntity = Matchers. <FeedbackEntity <List <Map <String, Object >>>> any (); Và nó luôn trả về null
Arun

6
Với các phiên bản mới của Mockito:(Matchers.<AsyncCallback<ResponseX>>any()
pierrefevrier

15
Matchersthực sự không được chấp nhận, nhưng ArgumentMatchersđã làm việc
guijob

67

Sử dụng Java 8, bạn có thể chỉ cần sử dụng any()(giả sử nhập tĩnh) mà không cần tham số hoặc tham số loại vì suy luận kiểu nâng cao. Bây giờ trình biên dịch biết từ loại đích (loại đối số phương thức) mà bạn thực sự muốn nói Matchers.<AsyncCallback<ResponseX>>any(), đó là giải pháp tiền Java 8.


Sẽ không any()phù hợp AsyncCallback<AnyOtherType>?
Matthew đọc

@MatthewRead Sử dụng AsyncCallback<AnyOtherType>thậm chí không nên biên dịch nếu loại đối số là 'AsyncCallback <FeedbackX>'.
herman

1
Tôi đang tự hỏi về một tình huống trong đó loại đối số cũng chung chung, nhưng bạn chỉ muốn giả định nó cho một loại cụ thể (hoặc giả định nó cho nhiều loại theo nhiều cách khác nhau). Với when(x.y(any())).thenAnswer(...)ví dụ, nơi ypublic <T> T y(AsyncCallback<T> arg). Có lẽ sẽ tốt hơn nếu kiểm tra loại trong câu trả lời, nếu đó là những gì cần thiết?
Matthew đọc

2
@MatthewRead Do bị xóa, loại thực tế có thể được kiểm tra trong thời gian chạy bởi Mockito. Vì vậy, bạn thậm chí không thể sử dụng isA(). Nếu đối tượng giữ một Classđối tượng tương ứng với loại và giao diện hiển thị điều này, tôi đoán bạn có thể kiểm tra nó trong một công cụ đối sánh tùy chỉnh. Hoặc ví dụ trong trường hợp Collectionbạn có thể kiểm tra loại phần tử.
herman

1
Matchersđã được thay thế bằng ArgumentMatcherstrong Mockito v2
bheussler

15

Tôi đã phải áp dụng các cơ chế sau đây để cho phép khái quát:

import static org.mockito.Matchers.any;
List<String> list = any();
when(callMyMethod.getResult(list)).thenReturn(myResultString);

Hy vọng điều này sẽ giúp được ai đó.


3
Xem câu trả lời của tôi: điều này không còn cần thiết với Java 8.
herman 17/12/14

5

Đăng bình luận pierrefevrier dưới dạng câu trả lời có thể hữu ích nếu nó xuất hiện trong câu trả lời thay vì bình luận.

Với các phiên bản mới của Mockito: (Matchers.<AsyncCallback<ResponseX>>any()


1
tôi đã thêm nhận xét của mình vào câu trả lời ban đầu
Joergi

2

Hơn nữa với câu trả lời của thSoft đưa cuộc gọi đủ điều kiện đến bất kỳ () nào trong phương thức có nghĩa là tôi có thể loại bỏ tiêu chuẩn do loại trả về cho phép suy luận:

private HashMap<String, String> anyStringStringHashMap() {
    return Matchers.any();
}

0

Bạn chỉ có thể truyền nó, thêm cảnh báo triệt tiêu nếu bạn muốn:

@SuppressWarnings("unchecked")    
AsyncCallback<ResponseX> callback = Mockito.any(AsyncCallback.class)

Nếu Java cho phép chung chung 'chung', họ có thể có một phương thức như thế này, đó là những gì bạn đang tìm kiếm

private static <T, E> T<E> mock(Class<T<E>> clazz)

Khi tôi thử điều này, tôi đã nhận được một lỗi trong bài kiểm tra của mình:You cannot use argument matchers outside of verification or stubbing.
kevinarpe 17/03/2016

Không phải là một ý tưởng tốt để sử dụng @SuppressWarnings: pre-java 8, nếu bạn định gán nó cho một biến riêng biệt, bạn chỉ có thể sử dụng any()như trong câu trả lời của theINtoy. Bây giờ với java 8, any()có thể được sử dụng nội tuyến mà không cần một bài tập riêng.
herman

@kevinarpe nếu bạn có nhiều đối sánh đối số thì chúng phải được gọi theo thứ tự như ngôn ngữ Java chỉ định.
TWiStErRob

0

Tôi gặp vấn đề tương tự khi sử dụng Spring Example:

Mockito.when(repo.findAll(Mockito.<Example<SrvReqToSupplierComment>>any()))
            .thenReturn(Lists.emptyList());

Tại đây, bạn phải sử dụng trình độ chuyên môn, phương pháp b / c findAll có thể có nhiều loại, như SortIterable. Tất nhiên bạn cũng có thể sử dụng Mockito.any(Example.class)với cảnh báo an toàn loại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.