Pourquoi ne pas JUnit fournir assertNotEquals méthodes?
Quelqu'un sait pourquoi JUnit 4 fournit assertEquals(foo,bar)
mais pas assertNotEqual(foo,bar)
méthodes?
Il fournit assertNotSame
(correspondant à assertSame
) et assertFalse
(correspondant à assertTrue
), de sorte qu'il semble étrange qu'ils n'ont pas pris la peine, y compris assertNotEqual
.
Par la manière, je sais que JUnit-addons fournit les méthodes, je suis à la recherche pour. Je demande juste de la curiosité.
- Au moins depuis JUnit 4.12, assertNotEquals est fourni. junit.org/junit4/javadoc/4.12/org/junit/...
Vous devez vous connecter pour publier un commentaire.
Je vous suggère d'utiliser le nouveau
assertThat()
style s'affirme, qui peut facilement décrire tous les types de négations et de construire automatiquement une description de ce qui vous attend et ce que vous avez obtenu, si l'assertion échoue:Tous les trois options sont équivalentes, choisissez celle que vous trouvez la plus lisible.
D'utiliser les simples noms de méthodes (et permettre à cette tendue syntaxe de travail), vous avez besoin de ces importations:
assertNotEquals()
.assertNotEqual
" je dirais que c'est parce que c'est un spécialisé affirmer qui ne sont pas nécessaires, aussi souvent queassertEquals
et, par conséquent, serait exprimée par le génériqueassertFalse
.assertThat
est un ensemble beaucoup plus expressive que l'ensemble limité deassert*
méthodes disponibles. Par conséquent, vous pouvez exprimer des contraintes sur une seule ligne, l'ai (presque) à lire comme une phrase anglaise et obtenez un message signicatif lorsque l'assertion échoue. D'accord, cela n'est pas toujours une killer feature, mais quand vous l'avez vu en action quelques fois, vous allez voir combien de valeur qu'il ajoute.assertThat
est plus expressive queassert*
, mais je ne pense pas que c'est plus expressive que l'expression de java, vous pouvez mettre à l'intérieur et hors de laassert*
expression en général (après tout ce que je peux exprimer quoi que ce soit dans du code java). C'est un problème général, j'ai commencé à venir à travers avec fluent par des Api, de chacun est fondamentalement un nouveau DSL vous avez à apprendre (quand nous savons tous déjà le code Java!). Je suppose que Hamcrest est omniprésent assez maintenant qu'il est raisonnable d'attendre des gens pour le savoir, si. Je vais avoir un jeu...import static org.junit.Assert.assertThat;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.not;
Il y a un
assertNotEquals
dans JUnit 4.11: https://github.com/junit-team/junit/blob/master/doc/ReleaseNotes4.11.md#improvements-to-assert-and-assumeJe me demande même. L'API de l'Assertion 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 à écrire:
Avec une telle affirmation, la seule partie informative de la sortie est malheureusement le nom de la méthode d'essai, de sorte descriptif message doit être formé séparément:
C'est donc fastidieux, que c'est mieux de rouler vos propres
assertNotEqual
. Heureusement, dans l'avenir, il sera peut-être partie de la JUnit: JUnit numéro 22Je dirais que l'absence de assertNotEqual est en effet une asymétrie et fait JUnit un peu moins faciles à apprendre. L'esprit que ce est un joli cas lors de l'ajout d'une méthode permettrait de diminuer la complexité de l'API, au moins pour moi: la Symétrie aide à la décision de la espace plus grand.
Ma conjecture est que la raison de l'omission peut être qu'il y a trop peu de gens l'appel de la méthode. Pourtant, je me souviens d'un temps où même assertFalse n'existe pas; par conséquent, j'ai une attente positive que la méthode peut éventuellement être ajouté, étant donné qu'il n'est pas difficile; même si je reconnais qu'il existe de nombreuses solutions de contournement, même élégant ceux.
Je suis venue à cette partie assez tard, mais j'ai trouvé que la forme:
peut être mis en oeuvre pour la plupart des "pas égal à' cas.
Je suis en train de travailler sur JUnit dans java 8 de l'environnement, à l'aide de jUnit4.12
pour moi: le compilateur n'a pas été en mesure de trouver la méthode la assertNotEquals, même lorsque j'ai utilisé
import org.junit.Assert;
J'ai donc changé
assertNotEquals("addb", string);
Assert.assertNotEquals("addb", string);
Donc si vous êtes confrontés problème concernant
assertNotEqual
pas reconnu, puis de le modifier pourAssert.assertNotEquals(,);
il faut résoudre votre problèmeimport static org.junit.Assert.*;
et vous serez en mesure d'utiliser toutes les affirme sans le nom de la classe.La raison évidente que les gens voulaient assertNotEquals() était de comparer les builtins sans avoir à les convertir à pleine soufflé d'objets:
Verbose exemple:
vs
Malheureusement depuis Eclipse ne comprend pas JUnit 4.11 par défaut, vous devez être commentée.
Mise en garde, je ne pense pas que le " 1 " doit être enveloppé dans un Entier.valueOf (), mais depuis que je suis récemment retourné à partir de .NET ne comptez pas sur mon exactitude.
Il est préférable d'utiliser le Hamcrest pour les assertions négatives plutôt que de assertFalse comme dans le premier cas, le rapport d'essai montrera un diff pour l'échec de l'assertion.
Si vous utilisez assertFalse, vous venez de passer un échec d'assertion dans le rapport. c'est à dire la perte d'informations sur la cause de l'échec.
Je suis totalement d'accord avec l'OP de point de vue.
Assert.assertFalse(expected.equals(actual))
n'est pas une façon naturelle d'exprimer une inégalité.Mais je dirais que, plus loin que
Assert.assertEquals()
,Assert.assertNotEquals()
fonctionne mais n'est pas convivial du document ce que le test s'affirme et de comprendre/debug que l'assertion échoue.Donc oui, JUnit 4.11 et JUnit 5 fournit
Assert.assertNotEquals()
(Assertions.assertNotEquals()
dans JUnit 5) mais j'ai vraiment éviter de les utiliser.Comme alternative, pour affirmer l'état d'un objet que j'générales d'utilisation d'un comparateur de API qui creuse dans l'état de l'objet facilement, ce document clairement l'intention de les affirmations et c'est très convivial pour comprendre la cause de l'échec de l'assertion.
Ici est un exemple.
Supposons que j'ai un Animal de la classe qui je veux tester le
createWithNewNameAndAge()
méthode, une méthode qui crée un nouvel Animal objet en changeant son nom et son âge, mais en gardant sa nourriture préférée.Supposons que j'utilise
Assert.assertNotEquals()
d'affirmer que l'original et les nouveaux objets sont différents.Ici est l'Animal de la classe avec des défauts de mise en œuvre de
createWithNewNameAndAge()
:JUnit 4.11+ (ou JUnit 5) à la fois en tant que lanceur de test et l'affirmation de l'outil
Le test échoue comme prévu, mais la cause fournies par le développeur n'est vraiment pas utile. Il dit seulement que les valeurs doivent être différents et de sortie de la
toString()
raison invoquée sur le réelAnimal
paramètre :Ok les objets ne sont pas égaux. Mais où est le problème ?
Le champ n'est pas correctement évaluée dans la méthode éprouvée ? Un ? Deux ? Chacun d'eux ?
Pour le découvrir, vous avez à creuser dans la
createWithNewNameAndAge()
de mise en œuvre/l'utilisation d'un débogueur tandis que le test de l'API serait beaucoup plus facile si il serait pour nous la différence entre ce qui est prévu et ce qui est obtenu.JUnit 4.11 comme lanceur de test et un test de Matcher API comme affirmation de l'outil
Ici le même scénario de test, mais qui utilise AssertJ (un excellent test de matcher API) afin de rendre l'affirmation de la
Animal
état: :Bien sûr, le test échoue toujours, mais cette fois, la raison est clairement indiqué :
Nous pouvons lire que pour
Animal::getName, Animal::getAge, Animal::getFavoriteFood
valeurs de retour des Animaux, nous nous attendons à avoir les valeurs suivantes :mais nous avons eu ces valeurs :
Donc nous savons où étudier :
name
etage
ne sont pas correctement évalués.En outre, le fait de spécifier la
hay
valeur dans l'affirmation deAnimal::getFavoriteFood()
permet également à plus finement affirmer le retour de l'Animal
. Nous voulons que les objets-être pas le même pour certaines propriétés, mais pas nécessairement pour toutes les propriétés.Donc, définitivement, à l'aide d'un comparateur de API est beaucoup plus clair et plus souple.
Modulo API cohérence, pourquoi JUnit n'ai pas fournir
assertNotEquals()
est la même raison pourquoi JUnit n'a jamais fourni des méthodes commeassertStringMatchesTheRegex(regex, str)
vsassertStringDoesntMatchTheRegex(regex, str)
assertStringBeginsWith(prefix, str)
vsassertStringDoesntBeginWith(prefix, str)
c'est à dire il n'y a pas de fin à fournir un spécifique méthodes d'assertion pour le genre de choses que vous voudrez peut-être dans votre assertion logique!
Beaucoup mieux de fournir composable test primitives comme
equalTo(...)
,is(...)
,not(...)
,regex(...)
et laisser le programmeur morceau ensemble à la place pour plus de lisibilité et de la raison.