assertEquals
utilise le equals
pour la comparaison. Il existe une affirmation différente, assertSame
qui utilise le ==
opérateur.
Pour comprendre pourquoi ==
ne doit pas être utilisé avec des chaînes de caractères, vous devez comprendre ce que les ==
fait : il effectue un contrôle d'identité. C'est-à-dire, a == b
vérifie si a
y b
se référer à la même objet . Il est intégré au langage, et son comportement ne peut pas être modifié par des classes différentes. Le site equals
d'autre part, peut être remplacée par des classes. Alors que son comportement par défaut (dans la méthode Object
) est d'effectuer un contrôle d'identité en utilisant la classe ==
opérateur, de nombreuses classes, dont String
pour effectuer une vérification d'"équivalence". Dans le cas de String
au lieu de vérifier si a
y b
font référence au même objet, a.equals(b)
vérifie si les objets auxquels ils font référence sont tous deux des chaînes de caractères contenant exactement les mêmes caractères.
Analogie : imaginez que chaque String
L'objet est un morceau de papier avec quelque chose d'écrit dessus. Disons que j'ai deux morceaux de papier avec "Foo" écrit dessus, et un autre avec "Bar" écrit dessus. Si je prends les deux premiers morceaux de papier et que je me sers de ==
pour les comparer, il retournera false
parce qu'il demande essentiellement "est-ce que c'est le même morceau de papier ?". Il n'a même pas besoin de regarder ce qui est écrit sur le papier. Le fait que je lui donne deux morceaux de papier (plutôt que le même deux fois) signifie qu'il retournera false
. Si j'utilise equals
Toutefois, le equals
va lire les deux morceaux de papier et voir qu'ils disent la même chose ("Foo"), et donc elle retournera true
.
Ce qui peut prêter à confusion avec les chaînes de caractères, c'est que Java a un concept d'"internage" des chaînes de caractères, et cela est (effectivement) automatiquement effectué sur tous les littéraux de chaîne de caractères dans votre code. Cela signifie que si vous avez deux chaînes de caractères équivalentes dans votre code (même si elles sont dans des classes différentes), elles feront toutes deux référence à la même chaîne de caractères String
objet. Cela rend le ==
retour de l'opérateur true
plus souvent que l'on pourrait s'y attendre.
1 votes
Si vous n'êtes pas sûr, vous pouvez lire le code, ou le Javadoc. BTW si vous voulez tester qu'il s'agit du même objet, vous pouvez utiliser assertSame.
2 votes
Si str1 et str2 sont nuls, assertEquals() est vrai, mais assertTrue(str1.equals(str2)) lève une exception. Le premier exemple imprime également un message d'erreur utile comme le contenu de str1 et str2, le second ne le fait pas.