2014-07-11 4 views
1

Je travaille avec une application Web Java qui a beaucoup de tests unitaires. Nous exécutons les tests unitaires dans Eclipse. Je passe par les tests et refactoring certains d'entre eux. Je l'ai vu quelques tests qui sont écrits comme ça (je vais la faire bouillir les affirmations, mes exemples littérales sont en fait des variables dans les tests)Comportement JUnit inattendu

assertEquals(new Integer(7), new Long(7)); 

Ce test passe !, et je ne comprends pas pourquoi, puisque les types sont différents. Après avoir vu ce comportement, j'ai créé un simple projet Java dans Eclipse et écrit essentiellement le même test unité

assertEquals(new Integer(7), new Long(7); 

et Failed comme je m'y attendais. Je n'ai pas besoin d'aide, j'étais juste curieux de savoir comment le test passe dans un environnement et échoue (comme il se doit) dans un autre.

+1

Il sera beaucoup plus facile de vous aider si vous incluez du code réel. –

+2

Etes-vous sûr qu'ils sont à la fois 'java.lang.Integer's? Sinon, peut-être une classe personnalisée pourrait remplacer la méthode d'égal à égal .... un coup de feu, sans doute, mais c'est une explication possible. –

+0

Nous serions en train de saisir les pailles ici, à moins que vous ne puissiez fournir les noms complets de 'Integer' et' Long'. Je suis d'accord avec @EdwinBuck en ce que c'est probablement quelque chose de surcharger l'une de ces classes, mais je ne suis pas sûr de quoi, et je ne suis pas sûr pourquoi. – Makoto

Répondre

1

Si vous regardez la méthode equals pour java.lang.Long il dit:

public boolean equals(Object obj) { 
    if (obj instanceof Long) { 
     return value == ((Long)obj).longValue(); 
    } 
    return false; 
} 

Alors new Long(7).equals(new Integer(7)) devrait être faux, parce que de Entier long est faux. Ce programme de test confirme que:

public class Stuff { 

    public static void main(String[] args) { 
     System.out.println("int equals long : " + new Integer(7).equals(new Long(7))); 
     System.out.println("long equals int : " + new Long(7).equals(new Integer(7))); 
    } 
} 

qui imprime

int equals long : false 
long equals int : false 

Je devine que le test d'application Web qui est venu avec le résultat opposé à celui utilisé un add-on comme ComparableAssert, qui a cette signature Il serait facile de se tromper pour l'autre, surtout si le test utilise des importations statiques. Longs et entiers sont comparables les uns aux autres (new Long(7).compareTo(new Integer(7)) évalue à 0) donc cet assertion réussirait.