2014-09-26 13 views
24

Sto provando a creare un simulato per una chiamata. dire che ho questo metodo che sto cercando di spegnere:Come scrivere un matcher che non è uguale a qualcosa

class ClassA { 
    public String getString(String a) { 
    return a + "hey"; 
    } 
} 

Quello che sto cercando di deridere fuori è: prima istanza è

when(classA.getString(eq("a")).thenReturn(...);` 

nello stesso banco di prova

when(classA.getString([anything that is not a])).thenReturn(somethingelse); 

Il secondo caso è la mia domanda: come faccio a far corrispondere anyString() oltre a "a"?

+0

Penso che potresti contrassegnare la risposta come accettata. – troig

risposta

7

Usa argThat con Hamcrest:

when(classA.getString(argThat(CoreMatchers.not(CoreMatchers.equalTo("a")))... 

Si potrebbe anche essere in grado di fare questo tramite ordinazione. Se si inserisce uno when(anyString) e when(eq("a")) nell'ordine corretto, Mockito dovrebbe testarli in ordine e fare la logica "a" quando appropriato e quindi la logica "anyString" in caso contrario.

44

Con Mockito quadro, è possibile utilizzare AdditionalMatchers

ClassA classA = Mockito.mock(ClassA.class); 
Mockito.when(classA.getString(Matchers.eq("a"))).thenReturn("something"); 
Mockito.when(classA.getString(AdditionalMatchers.not(Matchers.eq("a")))).thenReturn("something else"); 

Speranza che aiuta.

+0

Perché giù voto ...? – troig

+7

Questo dovrebbe essere accettato come risposta. –

-2

realtà ho preso questo approccio dopo aver attentamente guardando le risposte suggerite:

doAnswer(new Answer<String>() { 
    public String answer(InvocationOnMock invocation) throws Throwable { 
    String originalParam = (String) invocation.getArguments()[0]; 
    return StringUtils.equalsIgnoreCase(originalParam, "a") ? "Something" : "Something Else"; 
    } 
}).when(classA).getString(anyString()); 

Questo mi permette di gestire più di solo due casi, regolando la base rendimento dei params.

+2

Questa è una buona soluzione, ma penso che sia i miei che i proprietari di @John B siano più vicini alle tue richieste OP. – troig