2015-06-19 13 views
9

Tôi có một giao diện với các phương pháp sau đâyMockito lỗi với phương thức trả về tùy chọn <T>

public interface IRemoteStore { 

<T> Optional<T> get(String cacheName, String key, String ... rest); 

} 

Các thể hiện của các lớp thực hiện giao diện được gọi là remoteStore.

Khi tôi thử điều này với Mockito và sử dụng phương pháp này khi:

Mockito.when(remoteStore.get("a", "b").thenReturn("lol"); 

tôi nhận được lỗi:

Cannot resolved the method 'thenReturn(java.lang.String)'

tôi nghĩ rằng nó đã làm với thực tế là nhận được trả về một thể hiện của lớp Tùy chọn nên tôi đã thử cách này:

Mockito.<Optional<String>>when(remoteStore.get("cache-name", "cache-key")).thenReturn 
     (Optional.of("lol")); 

Nhưng, tôi gặp lỗi này thay vào đó:

when (Optional '<'String'>') in Mockito cannot be applied to (Optional'<'Object'>').

Lần duy nhất mà nó làm việc là với điều này:

String returnCacheValueString = "lol"; 
Optional<Object> returnCacheValue = Optional.of((Object) returnCacheValueString); 
Mockito.<Optional<Object>>when(remotestore.get("cache-name", "cache-key")).thenReturn(returnCacheValue); 

Nhưng trên trả về một thể hiện của Optional '< 'Object'>' và không bắt buộc '< 'String'>.

Tại sao tôi không thể trả lại một trường hợp Tùy chọn '<' Chuỗi '>' trực tiếp? Nếu có thể, tôi nên làm thế nào?

+0

Bạn không thiếu khung trong đoạn mã đầu tiên? – npe

+0

Ngoài ra, không nên nhầm lẫn 'java.util.Optional' với' com.google.common.base.Optional', vì sau này cần được nhập vào đây. – jckuester

Trả lời

10

Mocks trả lại có kỳ vọng rằng các kiểu trả về phù hợp với kiểu trả về đối tượng chế giễu của.

Đây là sai lầm:

Mockito.when(remoteStore.get("a", "b")).thenReturn("lol"); 

"lol" không phải là một Optional<String>, vì vậy nó sẽ không chấp nhận điều đó như một giá trị trả về giá trị.

Lý do nó làm việc khi bạn đã làm

Optional<Object> returnCacheValue = Optional.of((Object) returnCacheValueString); 
Mockito.<Optional<Object>>when(remotestore.get("cache-name", "cache-key")).thenReturn(returnCacheValue); 

là do returnCacheValue là một Optional.

Điều này rất dễ sửa: chỉ cần thay đổi thành Optional.of("lol") thay thế.

Mockito.when(remoteStore.get("a", "b")).thenReturn(Optional.of("lol")); 

Bạn cũng có thể loại bỏ các nhân chứng loại; kết quả trên sẽ được suy ra là Optional<String>.

+0

Xin cảm ơn vì đã trả lời. Vâng, tôi nhận ra lỗi và đã thay đổi nó. Điều gì đã sai là tôi đã không thiết lập trình độ ngôn ngữ dự án của tôi sang java 8. –

+0

Tôi sẽ không biết rằng từ việc đọc câu hỏi của bạn. 'Tùy chọn' là một lớp trong Google Guava - một thư viện của bên thứ ba rất phổ biến - và nó tương thích với Java 7. – Makoto

0

Không chắc lý do tại sao bạn đang nhìn thấy lỗi, nhưng điều này biên dịch/chạy lỗi cho tôi:

public class RemoteStoreTest { 
    public interface IRemoteStore { 
     <T> Optional<T> get(String cacheName, String key); 
    } 
    public static class RemoteStore implements IRemoteStore { 
     @Override 
     public <T> Optional<T> get(String cacheName, String key) { 
      return Optional.empty(); 
     } 
    } 

    @Test 
    public void testGet() { 
     RemoteStore remoteStore = Mockito.mock(RemoteStore.class); 

     Mockito.when(remoteStore.get("a", "b")).thenReturn(Optional.of("lol")); 
     Mockito.<Optional<Object>>when(remoteStore.get("b", "c")).thenReturn(Optional.of("lol")); 

     Optional<String> o1 = remoteStore.get("a", "b"); 
     Optional<Object> o2 = remoteStore.get("b", "c"); 

     Assert.assertEquals("lol", o1.get()); 
     Assert.assertEquals("lol", o2.get()); 
     Mockito.verify(remoteStore); 
    } 
} 
+0

Xin chào, cảm ơn vì phản hồi. Điều này làm cho tôi nhận ra rằng IDE của tôi có trình độ ngôn ngữ dự án được thiết lập ở java 7, không phải java 8. Nhưng tôi đang sử dụng Tùy chọn từ ổi, không phải Java 8 nhưng đó là một câu hỏi khác. Cảm ơn bạn. –

+2

Giải thích * tại sao * nó hoạt động tốt hơn là nói rằng nó làm.OP có thể không phải là người duy nhất có vấn đề này; những người khác có thể đến và có một câu hỏi tương tự trong tương lai. – Makoto

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