2012-04-09 5 views
7

In einem jUnit-Test möchte ich einige Zeilen aus der Datenbank basierend auf der Spalte name abrufen. Ich möchte dann testen, dass die Zeilen die Namen haben, die ich erwartet habe. Ich habe folgendes:jUnit und Guava, vergleicht die Gleichheit der Liste nach der Transformation()

Set<MyClass> typesToGet = MyClassFactory.createInstances("furniture", 
    "audio equipment"); 
Collection<String> namesToGet = Collections2.transform(typesToGet, 
    new NameFunction<MyClass, String>()); 
List<MyClass> typesGotten = _svc.getAllByName(typesToGet); 
assertThat(typesGotten.size(), is(typesToGet.size())); 
Collection<String> namesGotten = Collections2.transform(typesGotten, 
    new NameFunction<ItemType, String>()); 
assertEquals(namesToGet, namesGotten); // fails here 

ich derzeit diesen Fehler:

java.lang.AssertionError: expected: com.google.common.collect.Collections2$TransformedCollection<[audio equipment, furniture]> but was: com.google.common.collect.Collections2$TransformedCollection<[audio equipment, furniture]>

Also, was ist die sauberste, prägnante Art und Weise zu testen, dass ich Zeilen stieg wieder aus der Datenbank, deren name Spalte die Namen übereinstimmt I sagte ich wollte? Ich könnte eine for Schleife haben, die durchläuft und überprüft, dass jeder Name in der einen Liste in der anderen existiert, aber ich hoffte, genauer zu sein. So etwas wie der folgenden Pseudo-Code wäre schön:

List<MyClass> typesGotten = ...; 
["furniture", "audio equipment"].equals(typesGotten.map(type => type.getName())) 

Antwort

15

Sie containsAll() zweimal verwenden können, um zu überprüfen, dass Sie keinen fehlenden Wert haben oder einen unerwarteten Wert.

assertTrue(namesToGet.containsAll(namesGotten)); 
assertTrue(namesGotten.containsAll(namesToGet)); 

Aber wenn Sie sich entscheiden, List oder Set statt Collection zu verwenden, geben Sie die Schnittstellenvertrag, dass ein List an einen anderen List (same for Set) iff both contains the same values gleich ist.

Compares the specified object with this list for equality. Returns true if and only if the specified object is also a list, both lists have the same size, and all corresponding pairs of elements in the two lists are equal. (Two elements e1 and e2 are equal if (e1==null ? e2==null : e1.equals(e2)) .) In other words, two lists are defined to be equal if they contain the same elements in the same order. This definition ensures that the equals method works properly across different implementations of the List interface.


Ressourcen:

6

Wenn Sie Expe ct sie enthalten die gleichen Elemente, aber nicht unbedingt in der gleichen Reihenfolge, dann tun Sie einfach eine ImmutableSet Kopie von ihnen beiden und prüfen Sie, ob diese Sätze gleich sind. Wenn Sie erwarten, dass sie dieselbe Reihenfolge haben, dann kopieren Sie ImmutableList und prüfen Sie, ob diese gleich sind.

Collection hat wirklich keine Vorstellung von Gleichheit überhaupt.

6

Die sauberste und ausdrucksvollste Art und Weise eine solche Behauptung des Schreibens ist mit einem hamcrest Matcher:

assertThat(namesGotten, containsInAnyOrder(namesToGet)) 
+0

Ich glaube, ich fand 'containsInAnyOrder' beschrieben auf http://www.jarvana.com/jarvana/view/org/hamcrest/hamcrest-library/1.2.1/hamcrest-library-1.2.1-javadoc .jar! /org/hamcrest/Matchers.html, aber ich sehe keine Dokumentation darüber. Weißt du, ob es bestätigt, dass die beiden Sammlungen dieselbe Größe haben, dass Sammlung 1 nur Elemente in Sammlung 2 enthält und dass Sammlung 2 nur Elemente in Sammlung 1 enthält? –

+2

Die Hamcrest-Dokumentation fehlt in diesem Bereich ein wenig, daher lohnt es sich, ein paar Matcher auszuprobieren, um sich selbst davon zu überzeugen, dass sie das Richtige tun. Alternativ dazu finden Sie den Quellcode unter http://code.google.com/p/hamcrest/source/browse/trunk/hamcrest-java/hamcrest-library/src/main/java/org/hamcrest/collection/IsIterableContainingInAnyOrder.java ? r = 480. Ja, es prüft, ob Sammlung 1 alle Elemente von Sammlung 2 hat und umgekehrt, und daher dieselbe Größe haben. – Kkkev

3

Guava hat ein Verfahren, das finde ich gut, das Konzept in Verbindung steht, um Sie versuchen: symmetricDifference. Wenn die symmetricDifference leer ist, sind die Mengen gleich.

assetTrue(Sets.symmetricDifference(namesToGet, namesGotten).isEmpty()); 

Es kann jedoch nicht das "billigste" sein, da es eine Vereinigungs-, Schnitt- und Differenzoperation durchführt. Sie können auch überprüfen, ob die Gruppen die gleiche Größe haben. Ist dies nicht der Fall, enthalten sie nicht die gleichen Elemente. Wenn dies der Fall ist, können Sie überprüfen, ob die (asymmetrische) difference leer ist.

assertEquals(namesToGet.size(), namesGotten.size()); 
assertTrue(Sets.difference(namesToGet, namesGotten)); 
Verwandte Themen