web-dev-qa-db-fra.com

Comment écrire un matcher qui n'est pas égal à quelque chose

J'essaie de créer une maquette pour un appel. Disons que j'ai cette méthode que j'essaie de décrire:

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

Ce que j'essaie de faire, c'est: la 1ère instance est

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

dans le même cas de test

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

Le 2ème cas est ma question: comment faire correspondre anyString() autre que "a"?

41
Churk

Avec le framework Mockito, vous pouvez utiliser 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");

J'espère que cela aide.

84
troig

Utilisez argThat avec Hamcrest:

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

Vous pourriez également être en mesure de le faire via la commande. Si vous placez une when(anyString) et when(eq("a")) dans le bon ordre, Mockito devrait les tester dans l'ordre et faire la logique "a" le cas échéant, puis la logique "anyString" sinon.

8
John B

En mockito, le dernier tronçonnage est le plus important. Cela signifie que vous pouvez simplement utiliser les matchers standard pour vos besoins:

// "Default" return values.
when(classA.getString(ArgumentMatchers.anyString())).thenReturn(somethingelse);
// Specific return value for "a"
when(classA.getString(ArgumentMatchers.eq("a"))).thenReturn(something);

Notez que vous avez pour utiliser ArgumentMatchers pour les deux puisque vous les mélangez.

1
Pieter De Bie

J'ai en fait adopté cette approche après avoir soigneusement examiné les réponses suggérées:

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());

Cela me permet de gérer plus de deux cas en ajustant la base de retour sur les paramètres.

0
Churk