7
votes

Hashset dans des tests d'unité

J'ai un tas de méthodes de retour de hashset. J'aimerais que mon test d'unité vérifie l'état de ces objets, c'est-à-dire que vous confirmez que someobject.getName () == "foobar" code>.

Cependant, l'ordre Itérateur Hashset n'est pas garanti, alors mes tests d'unité échouent parfois. Comment écrivez-moi des tests d'unité pour quelque chose comme ça? P>

EG: P>

@Test
    public void testRowsToBeRead(){
        HashSet<SomeObject> rows = new SomeObject().read();
        assertEquals(19, rows.size());

        for(SomeObject r:rows){
            //How do I confirm contents?
        }
    }


0 commentaires

5 Réponses :


4
votes

Vous pouvez utiliser linkedhashset quelle commande garantie.


1 commentaires

Merci. Cela a besoin de moi pour changer la méthode actuelle. Je pourrais finir par faire cela un peu de temps à l'avenir, mais en ce moment, je suis juste à la recherche d'un test de l'unité.



4
votes

Mon approche:

@Override
public boolean equals(Object other) {
    return this.getField1().equals( ((SomeObject) other).getField1() );
}


7 commentaires

est égal à et HashCode doit être mis en œuvre à droite pour utiliser cette approche (et utiliser hashset).


J'ai déjà des tests d'unités égales et de hashcode, alors je pense que cela me donne exactement ce que je cherche.


Numéro de hashset ne va pas juste faire la même chose? I.e., si (! Expigurés.equaux (lignes)) {/ * échec * /}


@Arturs Licis: +1, selon Javadoc, vous avez raison, il devrait se comporter de la même manière ... a sauvé quatre lignes de code :-)


Le problème que j'ai maintenant, c'est que j'ai mis en place la méthode Equals, qui ne vérifie que 2 champs de l'objet par conception (il imite une table de dB). Toutefois, dans mon test de l'unité, je souhaite vérifier tous les champs tels que description, etc., ce qui n'est pas dans mes égaux. Donc, si 2 des champs sont échangés et que ces champs ne sont pas dans la mise en œuvre de mon équivalent, le test de l'unité donne un faux positif.


@Kapsh: Mise à jour de la réponse, cela aide-t-elle?


@Home merci. C'est exactement ce que j'ai fini par faire. A vu votre réponse aujourd'hui. Mes tests de l'unité sont assez verbeux à ce stade, mais cela résout le problème.



2
votes

Essayez d'utiliser ASSERTTHAT:

Assert.assertThat(r.getName(), AnyOf.anyOf(Is.is("foobar1"), Is.is("foobar2"), ...));


0 commentaires

2
votes

Vous pouvez utiliser ASSERT.AUSEREQUAIGALS () sur toute une collection avec TESTNG et probablement JUNIT.

Si vous souhaitez rouler vous-même vous-même, supprimez tous les éléments de l'ensemble réel de l'ensemble attendu et affirmez que la taille de l'ensemble attendu est nulle lorsque vous avez terminé.


0 commentaires

0
votes

Je recommande d'utiliser hashset.equals (objet) .

Javadoc dit:

Cette implémentation vérifie d'abord si l'objet spécifié est cet ensemble; Si c'est le cas, cela revient vrai. Ensuite, il vérifie si l'objet spécifié est un ensemble dont la taille est identique à la taille de cet ensemble; Sinon, il retourne faux. Si tel est le cas, il retourne contenttall ((collection) O).

Alors je pense que "la maison" "alternative 2" suffit.

Plus: Bien que hashset ne garantit pas la commande, des hashèsets égaux sont dans le même ordre et la même taille.


0 commentaires