web-dev-qa-db-fra.com

Junit assert OR condition dans mon cas de test

Dans mon cas de test, j'obtiens une valeur entière:

int val = getXXX();

Ensuite, je voudrais vérifier si val est égal à 3 ou égal à 5, ce qui est OK dans les deux cas. J'ai donc fait:

assertTrue(val == 3 || val==5);

J'exécute mon test, le journal affiche val est 5, mais mon code d'assertion ci-dessus a échoué avec AssertionFailedError. Il semble que je ne puisse pas utiliser assertTrue(...) de cette façon, alors, comment vérifier la condition OR?

25
Leem.fin

ive a essayé d'écrire un test rapide:

@Test
public void testName() {
    int i = 5;
    junit.framework.Assert.assertTrue(i == 3 || i == 5);

}

son passage toujours donc je suppose qu'il y a du code intermédiaire lorsque votre valeur est modifiée. Vous pouvez utiliser

org.junit.Assert.assertEquals(5, i);

pour vérifier la valeur - cette assertion imprimera de belles informations ce qui ne va pas, par exemple:

Java.lang.AssertionError: 
Expected :4
Actual   :5
18
smajlo

Vous pouvez utiliser Hamcrest matchers pour obtenir un message d'erreur plus clair ici:

int i = 2;
assertThat(i, Matchers.either(Matchers.is(3)).or(Matchers.is(5))

or

int i = 2;
assertThat(i, Matchers.anyOf(Matchers.is(3),Matchers.is(5)));

Cela expliquera plus clairement:

Expected: (is <3> or is <5>)
     but: was <2>

montrant exactement l'attente et la valeur incorrecte qui a été fournie.

44
Joe

Bien que les analyseurs Harmcrest puissent faire le travail, ces constantes peuvent être facilement refactorisées en une constante plus significative, comme une liste de valeurs valides. Ensuite, vous pouvez utiliser la méthode contains pour vérifier que la valeur est présente dans la liste - IMO est également plus facile à lire:

public class Foo {
    public static final List<Integer> VALID_VALUES = Arrays.asList(3, 5);
}

@Test
public void testName() {
    int i = 5;
    Assert.assertTrue(Foo.VALID_VALUES.contains(i));
}
4
A. Rodas

Dans mon cas, je voulais faire une logique d'assertion complexe, j'ai donc simplement implémenté une méthode qui renvoie un booléen et il a fait le travail, la façon dont il serait implémenté dans cet exemple est la suivante:

private Boolean is3or5(Integer val) {
    if(val == 3 || val == 5) {
        return true;
    }
    return false;
}

Ensuite, faites l'assertion:

assertTrue(is3or5(val));

Bien sûr, la méthode peut contenir une logique plus complexe si nécessaire

1
Mis94