Est-ce que quelqu'un sait pourquoi JUnit 4 fournit assertEquals(foo,bar)
mais pas des assertNotEqual(foo,bar)
méthodes?
Il fournit assertNotSame
(correspondant à assertSame
) et assertFalse
(correspondant à assertTrue
), il semble donc étrange qu'ils n'aient pas pris la peine d'inclure assertNotEqual
.
Soit dit en passant, je sais que les add-ons JUnit fournissent les méthodes que je recherche. Je demande juste par curiosité.
Réponses:
Je vous suggère d'utiliser les assertions de
assertThat()
style plus récentes , qui peuvent facilement décrire toutes sortes de négations et créer automatiquement une description de ce que vous attendez et de ce que vous obtenez si l'assertion échoue:Les trois options sont équivalentes, choisissez celle que vous trouvez la plus lisible.
Pour utiliser les noms simples des méthodes (et permettre à cette syntaxe tendue de fonctionner), vous avez besoin de ces importations:
la source
assertNotEquals()
.assertNotEqual
», je dirais que c'est parce que c'est une affirmation spécialisée qui n'est pas nécessaire aussi souventassertEquals
et qui serait donc exprimée via le génériqueassertFalse
.assertThat
est beaucoup plus expressif que l'ensemble limité deassert*
méthodes disponibles. Par conséquent, vous pouvez exprimer les contraintes exactes sur une seule ligne, la lire (presque) comme une phrase en anglais et obtenir un message significatif lorsque l'assertion échoue. Certes, ce n'est pas toujours une fonctionnalité qui tue, mais quand vous l'avez vue en action à plusieurs reprises, vous verrez combien elle ajoute de la valeur.assertThat
c'est plus expressif queassert*
, mais je ne pense pas que ce soit plus expressif que l'expression java que vous pouvez mettre à l'intérieur et à l'extérieur de l'assert*
expression en général (après tout, je peux tout exprimer en code java). C'est un problème général que j'ai commencé à rencontrer avec des API de style fluide - chacune est fondamentalement une nouvelle DSL que vous devez apprendre (quand nous connaissons déjà la Java!). Je suppose que Hamcrest est suffisamment omniprésent maintenant qu'il est raisonnable de s'attendre à ce que les gens le sachent. Je vais jouer ...Il y en a
assertNotEquals
dans JUnit 4.11: https://github.com/junit-team/junit/blob/master/doc/ReleaseNotes4.11.md#improvements-to-assert-and-assumela source
Je me demande la même chose. L'API d'Assert n'est pas très symétrique; pour tester si les objets sont les mêmes, il fournit
assertSame
etassertNotSame
.Bien sûr, il n'est pas trop long pour écrire:
Avec une telle affirmation, la seule partie informative de la sortie est malheureusement le nom de la méthode de test, donc le message descriptif doit être formé séparément:
C'est bien sûr si fastidieux, qu'il vaut mieux rouler le vôtre
assertNotEqual
. Heureusement, à l'avenir, il fera peut-être partie du JUnit: JUnit numéro 22la source
Je dirais que l'absence de assertNotEqual est en effet une asymétrie et rend JUnit un peu moins apprenable. Gardez à l'esprit qu'il s'agit d'un cas intéressant lorsque l'ajout d'une méthode réduirait la complexité de l'API, du moins pour moi: la symétrie permet de gouverner le plus grand espace. Je suppose que la raison de l'omission est peut-être qu'il y a trop peu de gens qui demandent la méthode. Pourtant, je me souviens d'une époque où même affirmerFaux n'existait pas; par conséquent, j'ai une attente positive que la méthode puisse éventuellement être ajoutée, étant donné qu'elle n'est pas difficile; même si je reconnais qu'il existe de nombreuses solutions de contournement, même élégantes.
la source
Je viens à cette fête assez tard mais j'ai trouvé que le formulaire:
peut fonctionner pour la plupart des cas «différents».
la source
Je travaille sur JUnit dans un environnement java 8, en utilisant jUnit4.12
pour moi: le compilateur n'a pas pu trouver la méthode assertNotEquals, même lorsque j'ai utilisé
import org.junit.Assert;
J'ai donc changé
assertNotEquals("addb", string);
pour
Assert.assertNotEquals("addb", string);
Donc, si vous rencontrez un problème concernant
assertNotEqual
non reconnu, alors changez-le pourAssert.assertNotEquals(,);
résoudre votre problèmela source
import static org.junit.Assert.*;
et vous pourrez utiliser toutes les assertions sans le nom de la classe.La raison évidente pour laquelle les gens voulaient assertNotEquals () était de comparer les buildins sans avoir à les convertir en objets à part entière:
Exemple détaillé:
contre.
Malheureusement, comme Eclipse n'inclut pas JUnit 4.11 par défaut, vous devez être bavard.
Attention, je ne pense pas que le «1» doive être enveloppé dans un Integer.valueOf () mais puisque je suis récemment revenu de .NET, ne comptez pas sur mon exactitude.
la source
Il est préférable d'utiliser Hamcrest pour les assertions négatives plutôt que assertFalse car dans le premier, le rapport de test montrera un diff pour l'échec de l'assertion.
Si vous utilisez assertFalse, vous obtenez simplement un échec d'assertion dans le rapport. c'est-à-dire des informations perdues sur la cause de l'échec.
la source
Habituellement, je fais cela lorsque je m'attends à ce que deux objets soient égaux:
et:
quand ils devraient être inégaux. Je suis conscient que ce n'est pas une réponse à votre question mais c'est le plus proche que je peux obtenir. Cela pourrait aider les autres à rechercher ce qu'ils peuvent faire dans les versions de JUnit avant JUnit 4.11.
la source
Je suis totalement d'accord avec le point de vue OP.
Assert.assertFalse(expected.equals(actual))
n'est pas un moyen naturel d'exprimer une inégalité.Mais je dirais que plus que
Assert.assertEquals()
, lesAssert.assertNotEquals()
œuvres , mais n'est pas facile à utiliser pour documenter ce que le test affirme en fait et de comprendre / debug que l'assertion échoue.Donc oui, JUnit 4.11 et JUnit 5 fournissent
Assert.assertNotEquals()
(Assertions.assertNotEquals()
dans JUnit 5) mais j'évite vraiment de les utiliser.En guise d'alternative, pour affirmer l'état d'un objet, j'utilise généralement une API de correspondance qui creuse facilement dans l'état de l'objet, qui documente clairement l'intention des assertions et qui est très conviviale pour comprendre la cause de l'échec de l'assertion.
Voici un exemple.
Supposons que j'ai une classe Animal dont je veux tester la
createWithNewNameAndAge()
méthode, une méthode qui crée un nouvel objet Animal en changeant son nom et son âge mais en gardant sa nourriture préférée.Supposons que j'utilise
Assert.assertNotEquals()
pour affirmer que l'original et les nouveaux objets sont différents.Voici la classe Animal avec une implémentation imparfaite de
createWithNewNameAndAge()
:JUnit 4.11+ (ou JUnit 5) à la fois comme lanceur de test et outil d'assertion
Le test échoue comme prévu mais la cause fournie au développeur n'est vraiment pas utile. Il dit simplement que les valeurs doivent être différentes et produire le
toString()
résultat appelé sur leAnimal
paramètre réel :Ok les objets ne sont pas égaux. Mais où est le problème?
Quel champ n'est pas correctement évalué dans la méthode testée? Une ? Deux ? Tous ?
Pour le découvrir, vous devez creuser dans l'
createWithNewNameAndAge()
implémentation / utiliser un débogueur tandis que l'API de test serait beaucoup plus conviviale si elle faisait pour nous le différentiel entre ce qui est attendu et ce qui est obtenu.JUnit 4.11 en tant que lanceur de test et une API Matcher de test en tant qu'outil d'assertion
Voici le même scénario de test mais qui utilise AssertJ (une excellente API de test matcher) pour faire l'affirmation de l'
Animal
état::Bien sûr, le test échoue toujours, mais cette fois, la raison est clairement indiquée:
Nous pouvons lire que pour les
Animal::getName, Animal::getAge, Animal::getFavoriteFood
valeurs de l'animal retourné, nous nous attendons à avoir ces valeurs:mais nous avons eu ces valeurs:
Nous savons donc où enquêter:
name
etage
ne sont pas correctement évalués. De plus, le fait de spécifier lahay
valeur dans l'assertion deAnimal::getFavoriteFood()
permet également d'affirmer plus finement le retourAnimal
. Nous voulons que les objets ne soient pas les mêmes pour certaines propriétés mais pas nécessairement pour toutes les propriétés.Donc, certainement, l'utilisation d'une API Matcher est beaucoup plus claire et flexible.
la source
La cohérence de l'API Modulo, pourquoi JUnit n'a pas fourni,
assertNotEquals()
c'est la même raison pour laquelle JUnit n'a jamais fourni de méthodes commeassertStringMatchesTheRegex(regex, str)
contre.assertStringDoesntMatchTheRegex(regex, str)
assertStringBeginsWith(prefix, str)
contre.assertStringDoesntBeginWith(prefix, str)
c'est-à-dire qu'il n'y a pas de fin à fournir des méthodes d'assertion spécifiques pour le genre de choses que vous pourriez souhaiter dans votre logique d'assertion!
Il est préférable de fournir des primitives de test composables comme
equalTo(...)
,is(...)
,not(...)
,regex(...)
et laisser la pièce de programmeur les ensemble au lieu pour plus de lisibilité et de santé mentale.la source