JUnit - assertSame
Quelqu'un peut me dire pourquoi assertSame() faire échouer lorsque j'utilise les valeurs de > 127?
import static org.junit.Assert.*;
...
@Test
public void StationTest1() {
..
assertSame(4, 4); //OK
assertSame(10, 10); //OK
assertSame(100, 100); //OK
assertSame(127, 127); //OK
assertSame(128, 128); //raises an junit.framework.AssertionFailedError!
assertSame(((int) 128),((int) 128)); //also junit.framework.AssertionFailedError!
}
Je suis en utilisant JUnit 4.8.1.
- Vous devez utiliser
assertSame
seulement pour la référence à l'égalité des vérifications par exemplea == b
. Pour l'égalité, vous devez utiliserassertEquals
.
Vous devez vous connecter pour publier un commentaire.
La raison est l'autoboxing de Java.
Vous utilisez la méthode:
Il ne fonctionne qu'avec les Objets. Lorsque vous passez
int
s à cette méthode, Java automatiquement les appelsavec ces valeurs. Si le casting de
int
n'a aucun effet.Pour des valeurs inférieures à 128 Java dispose d'un cache, de sorte
assertSame()
compare lesInteger
objet avec lui-même. Pour des valeurs supérieures à 127 Java crée de nouvelles instances, de sorteassertSame()
compare unInteger
objet avec un autre. Parce qu'ils ne sont pas dans la même instance, leassertSame()
méthode renvoie false.Vous devez utiliser la méthode:
à la place. Cette méthode utilise la
equals()
méthode deObject
.assertSame
prend deuxObject
arguments, et donc que le compilateur doit autobox votreint
littéraux dansInteger
.C'est l'équivalent de
Maintenant, pour des valeurs comprises entre -128 et 127, la JVM va mettre en cache les résultats de
Integer.valueOf
, de sorte que vous obtenez le mêmeInteger
objet de revenir à chaque fois. Pour les valeurs en dehors de cette plage, vous obtenez de nouveaux objets.Donc pour
assertSame(127, 127)
, JUnit est de comparer les mêmes objets, donc il fonctionne. PourassertSame(128, 128)
, vous obtenez différents objets, si elle échoue.Juste une autre raison d'être prudent avec l'autoboxing.