2015-06-19 11 views
9

mam interfejs z następującym sposobembłąd Mockito z metody, która zwraca Opcjonalnie <T>

public interface IRemoteStore { 

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

} 

Instancja klasy implementującej interfejs nazywa remoteStore.

Kiedy mock to z Mockito i zastosować metodę, gdy:

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

pojawia się błąd:

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

myślałem, że ma do czynienia z faktem, że dostać zwraca instancję Opcjonalna klasa, więc próbowałem tego:

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

Ale pojawia się ten błąd:

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

Tylko raz to działało było z tym:

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

Ale przede zwraca instancję opcjonalny '< 'obiektu'>' i nie Opcjonalnie "< 'String'>.

Dlaczego nie można po prostu zwrócić instancji Opcjonalnie "<" Ciąg ">" bezpośrednio? Gdybym mógł, jak mam to zrobić?

+0

Nie brakuje pan nawiasu w pierwszym kawałku kodu? – npe

+0

Również FYI, nie mylić 'java.util.Optional' z' com.google.common.base.Optional', ponieważ ten drugi musi zostać zaimportowany tutaj. – jckuester

Odpowiedz

10

Mocks zwracające mieć oczekiwanie, że zwracany typ pasuje typ zwracany przez szydził obiektu.

Tutaj jest błąd:

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

"lol" nie jest Optional<String>, więc nie będzie akceptować, że jako ważnej wartości zwracanej.

Powodem to działało kiedy zrobiłeś

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

wynika returnCacheValue bycia Optional.

Jest to łatwe do naprawienia: wystarczy zmienić na Optional.of("lol").

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

Można również pozbyć się świadków typu; powyższy wynik zostanie oszacowany jako Optional<String>.

+0

Hej dzięki za odpowiedź. Tak, zdałem sobie sprawę z błędu i go zmieniłem. Co było nie tak, to nie ustawiłem poziomu mojego projektu na java 8. –

+0

Nie wiedziałbym o tym czytając twoje pytanie. "Opcjonalnie" to klasa w Google Guava - bardzo popularnej bibliotece firm trzecich - i jest zgodna z Javą 7. – Makoto

0

Nie wiem, dlaczego widzisz błędy, ale to kompiluje/działa bezbłędnie dla mnie:

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

Hej Don, dzięki za odpowiedź. Uświadomiłem sobie, że mój IDE ma ustawiony poziom języka projektu na java 7, a nie java 8. Ale używam Opcjonalnego z Guava, nie z Java 8, ale to jest inne pytanie. Dziękuję Ci. –

+2

Wyjaśnienie * dlaczego * działa lepiej niż powiedzenie, że tak.OP nie może być jedyną osobą, która ma ten problem; inni mogą przyjść i mieć podobne pytanie w przyszłości. – Makoto

Powiązane problemy