web-dev-qa-db-fra.com

Plusieurs résultats corrects avec Hamcrest (y a-t-il un or-matcher?)

Je suis relativement nouveau dans les matchers. Je joue avec hamcrest en combinaison avec JUnit et je l'aime un peu.

Existe-t-il un moyen de déclarer que l'un des choix multiples est correct?

Quelque chose comme

assertThat( result, is( either( 1, or( 2, or( 3 ) ) ) ) ) //does not work in hamcrest

La méthode que je teste renvoie un élément d'une collection. La liste peut contenir plusieurs candidats. Mon implémentation actuelle renvoie le premier hit, mais ce n'est pas une exigence. Je voudrais que mon cas test réussisse, si l'un des candidats possibles est retourné. Comment exprimeriez-vous cela en Java?

(Je suis ouvert aux alternatives hamcrest)

70
Mo.
assertThat(result, anyOf(equalTo(1), equalTo(2), equalTo(3)))

De tutoriel Hamcrest :

anyOf - correspond si des correspondants correspondent, des courts-circuits (comme Java ||)

Voir aussi Javadoc .

De plus, vous pouvez écrire votre propre Matcher, ce qui est assez facile à faire.

107
marcospereira

marcos a raison, mais vous avez également quelques autres options. Tout d'abord, il y a un soit/ou:

assertThat(result, either(is(1)).or(is(2)));

mais si vous avez plus de deux articles, cela deviendrait probablement lourd. De plus, le vérificateur de typographie devient parfois bizarre sur des choses comme ça. Pour votre cas, vous pourriez faire:

assertThat(result, isOneOf(1, 2, 3))

ou si vous avez déjà vos options dans un tableau/Collection:

assertThat(result, isIn(theCollection))

Voir aussi Javadoc .

78
MatrixFrog