2015-06-19 23 views
9

Ho un'interfaccia con il seguente metodoerrore Mockito con metodo che restituisce opzionale <T>

public interface IRemoteStore { 

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

} 

L'istanza della classe che implementa l'interfaccia è chiamata remoteStore.

Quando rido questo con Mockito e utilizzare il metodo in cui:

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

ottengo l'errore:

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

ho pensato che ha a che fare con il fatto che ottiene restituisce un'istanza di la classe opzionale così ho provato questo:

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

Ma, ottengo questo errore invece:

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

L'unica volta che ha funzionato è stato con questo:

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

Ma soprattutto restituisce un'istanza opzionale '< 'Oggetto'>' e non opzionale '< 'String'>.

Perché non è possibile restituire direttamente un'istanza di "<" Stringa "facoltativa? Se potessi, come dovrei fare per farlo?

+0

Non ti manca una parentesi nel primo pezzo di codice? – npe

+0

Inoltre, non confondere 'java.util.Optional' con' com.google.common.base.Optional', in quanto quest'ultimo deve essere importato qui. – jckuester

risposta

10

Mocks che restituiscono avere l'aspettativa che il tipo restituito corrisponde tipo di ritorno dell'oggetto preso in giro.

Ecco l'errore:

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

"lol" non è un Optional<String>, in modo da non accettare che come valore di ritorno valido.

Il motivo che ha funzionato quando hai fatto

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

è dovuto al returnCacheValue essere un Optional.

Questo è facile da risolvere: basta sostituirlo con un Optional.of("lol").

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

È anche possibile eliminare i testimoni di tipo; il risultato sopra sarà dedotto per essere Optional<String>.

+0

Hey, grazie per la risposta. Sì, ho capito l'errore e l'ho cambiato. Quello che non andava era che non avevo impostato il mio livello di linguaggio del progetto su java 8. –

+0

Non avrei saputo che leggendo la tua domanda. 'Optional' è una classe in Google Guava - una libreria di terze parti molto popolare - ed è compatibile con Java 7. – Makoto

0

Non certo perché si sta vedendo gli errori, ma questo compila/corre senza errori per me:

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

Hey Don, grazie per la risposta. Questo mi ha fatto capire che il mio IDE ha il livello di lingua del progetto impostato su java 7, non su java 8. Ma sto usando Optional da Guava, non da Java 8, ma questa è una domanda diversa. Grazie. –

+2

Spiegare * perché * funziona è meglio che dire che lo fa.L'OP potrebbe non essere l'unica persona che ha questo problema; altri potrebbero entrare e avere una domanda simile in futuro. – Makoto

Problemi correlati