Collection
Elemanların eşitliğini , özellikle Set
de JUnit 4'te özlü bir şekilde nasıl iddia edersiniz ?
Collection
Elemanların eşitliğini , özellikle Set
de JUnit 4'te özlü bir şekilde nasıl iddia edersiniz ?
Yanıtlar:
İki Set
s'nin birbirine eşit olduğunu iddia edebilirsiniz , bu da Set
equals()
yöntemi çağırır .
public class SimpleTest {
private Set<String> setA;
private Set<String> setB;
@Before
public void setUp() {
setA = new HashSet<String>();
setA.add("Testing...");
setB = new HashSet<String>();
setB.add("Testing...");
}
@Test
public void testEqualSets() {
assertEquals( setA, setB );
}
}
Bu @Test
iki halinde geçecek Set
ler aynı boyutta ve aynı elemanları içermektedir.
equals
ve uyguluyor musunuz hashCode
?
Apache kurtarmaya tekrar ortak olur.
assertTrue(CollectionUtils.isEqualCollection(coll1, coll2));
Tıkır tıkır çalışıyor. Nedenini bilmiyorum ama koleksiyonlarda aşağıdakilerin assertEquals(coll1, coll2)
her zaman işe yaramadığını buldum . Benim için başarısız olması durumunda, Sets tarafından desteklenen iki koleksiyonum vardı. Ne hamcrest ne de junit, emin olduğumdan emin olmama rağmen koleksiyonların eşit olduğunu söylemezdi. CollectionUtils'i kullanmak mükemmel çalışıyor.
ile hamcrest :
assertThat(s1, is(s2));
düz iddia ile:
assertEquals(s1, s2);
NB: t beton set sınıfının equals () yöntemi kullanılır
Özellikle ilginç bir durum,
java.util.Arrays$ArrayList<[[name,value,type], [name1,value1,type1]]>
ve
java.util.Collections$UnmodifiableCollection<[[name,value,type], [name1,value1,type1]]>
Şimdiye kadar gördüğüm tek çözüm, ikisini de setlere dönüştürmek.
assertEquals(new HashSet<CustomAttribute>(customAttributes), new HashSet<CustomAttribute>(result.getCustomAttributes()));
Ya da onları öğe öğe karşılaştırabilirim.
Dizi tabanlı ek bir yöntem olarak ... sırasız dizi iddialarını junitx'te kullanmayı düşünebilirsiniz. Apache CollectionUtils örneği işe yarayacak olsa da, orada da bir dizi katı iddia uzantısı var:
Bence
ArrayAssert.assertEquivalenceArrays(new Integer[]{1,2,3}, new Integer[]{1,3,2});
yaklaşımı sizin için çok daha okunabilir ve hata ayıklanabilir olacaktır (tüm Koleksiyonlar toArray () 'ı destekler, bu nedenle ArrayAssert yöntemlerini kullanmak yeterince kolay olmalıdır.
Tabii ki buradaki dezavantajı, junitx'in ek bir jar dosyası veya maven girişi olmasıdır ...
<dependency org="junit-addons" name="junit-addons" rev="1.4"/>
Kontrol bu yazıyı . Oradan bir örnek:
@Test
public void listEquality() {
List<Integer> expected = new ArrayList<Integer>();
expected.add(5);
List<Integer> actual = new ArrayList<Integer>();
actual.add(5);
assertEquals(expected, actual);
}
Hamcrest Kullanımı:
assertThat( set1, both(everyItem(isIn(set2))).and(containsInAnyOrder(set1)));
Bu, kümeler farklı veri türlerine sahip olduğunda da çalışır ve yalnızca başarısız olmak yerine farkı rapor eder.
Bir Liste veya Kümenin belirli bir değer kümesi içerip içermediğini kontrol etmek istiyorsanız (zaten var olan bir koleksiyonla karşılaştırmak yerine), genellikle toString koleksiyon yöntemi kullanışlıdır:
String[] actualResult = calltestedmethod();
assertEquals("[foo, bar]", Arrays.asList(actualResult).toString());
List otherResult = callothertestedmethod();
assertEquals("[42, mice]", otherResult.toString());
Bu, beklenen koleksiyonu ilk oluşturup onu gerçek koleksiyonla karşılaştırmaktan biraz daha kısadır ve yazmak ve düzeltmek daha kolaydır.
(Kuşkusuz, bu özellikle temiz bir yöntem değildir ve "foo, bar" öğesini iki öğeden "foo" ve "bar" dan ayırt edemez. Ancak pratikte testleri yazmanın kolay ve hızlı olması bence çok önemlidir , aksi takdirde birçok geliştirici basılmadan yapmaz.)
Hans-Peter Störr'ün çözümünü beğendim ... Ama bence bu pek doğru değil. Ne yazık ki containsInAnyOrder
, Collection
karşılaştırmak için nesnelerden birini kabul etmiyor . Bu yüzden bir olmak zorunda Collection
arasında Matcher
s:
assertThat(set1, containsInAnyOrder(set2.stream().map(IsEqual::equalTo).collect(toList())))
İthalat:
import static java.util.stream.Collectors.toList;
import static org.hamcrest.Matchers.containsInAnyOrder;
import static org.junit.Assert.assertThat;