Tôi đang sử dụng mockito 1.9.5. Tôi có đoạn mã sau:chế nhạo một phương thức trả lại Generics bằng ký tự đại diện bằng mockito
public class ClassA {
public List<? extends MyInterface> getMyInterfaces() {
return null;
}
public static void testMock() {
List<MyInterface> interfaces = new ArrayList<>();
ClassA classAMock = mock(ClassA.class);
when(classAMock.getMyInterfaces()).thenReturn(interfaces);
}
tôi nhận được một lỗi biên dịch cho thenReturn(interfaces)
nói:
"The method thenReturn(List<capture#1-of ? extends MyInterface>) in the type
OngoingStubbing<List<capture#1-of ? extends MyInterface>> is not applicable for the arguments
(List<MyInterface>)"
Tuy nhiên, khi tôi sử dụng phương pháp thenAnswer
của Mockito, tôi không nhận được lỗi. Bất cứ ai có thể cho tôi biết những gì đang xảy ra? Tại sao tôi gặp lỗi khi sử dụng phương thức thenReturn
? Có cách nào khác để giải quyết vấn đề này khi ClassA
được cung cấp bởi bên thứ 3 và không thể sửa đổi được không?
Bạn không nên có ký tự đại diện trong việc tái tạo lại 'getMyInterfaces'. Đó không phải là một thực hành tốt, bởi vì khách hàng của api đó phải đối phó với một ký tự đại diện mà họ không biết bất cứ điều gì về. – SpaceTrucker
Tôi không kiểm soát API này. Nó được đưa ra bởi một bên thứ 3. – user1504992
@SpaceTrucker Tôi nghĩ rằng có kiểu trả về như 'Danh sách mở rộng MyInterface> 'là một điều hoàn toàn hợp lý để làm. Nó có nghĩa là bạn (là người gọi phương thức) có thể lấy các đối tượng 'MyInterface' ra khỏi danh sách, nhưng bạn không thể đặt bất cứ thứ gì vào đó. –