JUnit'te CollectionAssert?


Yanıtlar:


126

JUnit 4.4'ü kullanarak assertThat(), koleksiyonlar üzerinde işleyenler.jar de dahil olmak üzere karmaşık kendini tanımlayan iddialar üretmek için Hamcrest koduyla birlikte kullanabilirsiniz (endişelenmeyin, JUnit ile birlikte gelir, fazladan gerek yoktur )

import static org.junit.Assert.assertThat;
import static org.junit.matchers.JUnitMatchers.*;
import static org.hamcrest.CoreMatchers.*;

List<String> l = Arrays.asList("foo", "bar");
assertThat(l, hasItems("foo", "bar"));
assertThat(l, not(hasItem((String) null)));
assertThat(l, not(hasItems("bar", "quux")));
// check if two objects are equal with assertThat()

// the following three lines of code check the same thing.
// the first one is the "traditional" approach,
// the second one is the succinct version and the third one the verbose one 
assertEquals(l, Arrays.asList("foo", "bar")));
assertThat(l, is(Arrays.asList("foo", "bar")));
assertThat(l, is(equalTo(Arrays.asList("foo", "bar"))));

Bu yaklaşımı kullanarak, başarısız olduğunda otomatik olarak iddianın iyi bir tanımını alacaksınız.


1
Ooh, Hamcrest'in junit dağıtımına girdiğini fark etmemiştim. Nat git!
skaffman

L'nin öğelerden ("foo", "bar") oluştuğunu, ancak başka öğe olmadığını iddia etmek istersem - bunun için bazı kolay sözdizimi var mı?
ripper234

Yukarıdaki kod parçacığını kullanın ve ek bir assert atınTrue (l.size () == 2)
aberrant80

4
Ah, çirkin. CollectionAssert.AreEqual olan NUnit'te (Koleksiyon bekleniyor, Koleksiyon gerçek);
ripper234

1
Google, aradığım başka bir Stackoverflow yanıtı buldu!
Mykola Golubyev

4

Doğrudan değil, hayır. JUnit (ve diğer test çerçeveleri) ile güzel bir şekilde bütünleşen zengin bir eşleştirme kuralları seti sağlayan Hamcrest'in kullanılmasını öneriyorum.


Bu bazı nedenlerle derlenmez (bkz. Stackoverflow.com/questions/1092981/hamcrests-hasitems ): ArrayList <Integer> actual = new ArrayList <Integer> (); ArrayList <Integer> beklenen = new ArrayList <Integer> (); real.add (1); beklenen.add (2); assertThat (gerçek, hasItems (beklenen));
ripper234


2

Joachim Sauer'ın çözümü güzeldir ancak sonucunuzda olduğunu doğrulamak istediğiniz bir dizi beklentiniz varsa işe yaramaz. Bu, testlerinizde bir sonucu karşılaştırmak istediğiniz, zaten oluşturulmuş veya sabit bir beklentiniz olduğunda veya belki de sonuçta birleştirilmesini beklediğiniz birden fazla beklentiniz olduğunda ortaya çıkabilir. Bunun yerine matchers kullanmanın sadece işime yarar List::containsAllve assertTrueÖrnek:

@Test
public void testMerge() {
    final List<String> expected1 = ImmutableList.of("a", "b", "c");
    final List<String> expected2 = ImmutableList.of("x", "y", "z");
    final List<String> result = someMethodToTest(); 

    assertThat(result, hasItems(expected1)); // COMPILE ERROR; DOES NOT WORK
    assertThat(result, hasItems(expected2)); // COMPILE ERROR; DOES NOT WORK

    assertTrue(result.containsAll(expected1));  // works~ but has less fancy
    assertTrue(result.containsAll(expected2));  // works~ but has less fancy
}

Her zaman kullanabilirsiniz hasItems(expected1.toArray(new String[expected1.size()])). Size daha iyi hata mesajları verecektir.
meustrus
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.