2011-08-12 15 views
5

Ben HashSet dönen yöntemlerden bir grup var test eder. Ünite testimin bu nesnelerin durumunu kontrol etmesini isterim, yani someObject.getName() == "foobar"'u onaylayın. Benim birim testleri bazı kere başarısız böylece HashSet yineleyici sıralaması garanti edilmez AncakHashSet

. Böyle bir şey için birim testleri nasıl yazarım?

Örn:

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

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

ben çok erken bir cevap kabul olabileceğini düşünüyorum.

Şimdi sahip sorun yalnızca tasarım başına nesne 2 alanlar (bir DB tablo taklit eden) için kontrol eşittir yöntemi uygulamaya olmasıdır. Ancak benim birim sınama, benim eşittir olmayan açıklama vb gibi tüm alanlar için kontrol etmek istiyorum. Yani 2 alan değiştiyse ve bu alanlar benim eşitlik uygulamasında değilse, birim testi yanlış bir pozitif verir.

cevap

4

My yaklaşımı: Eğer olması gerektiği gibi SomeObject 'ın equals ve hashCode yöntemler işe doğrulayan diğer birim testleri gerekebilir Bu testte güvenmek için

public void testRowsToBeRead(){ 
    HashSet<SomeObject> expectedRows = new HasSet<SomeObject(); 
    expectedRows.add(new SomeObject("abc")); 
    expectedRows.add(new SomeObject("def")); 

    HashSet<SomeObject> rows = new SomeObject().read(); 

    // alternative 1 
    assertEquals(19, rows.size()); 

    for(SomeObject r:rows){ 
     if (!expectedRows.contains(r)) { 
      // test failed 
     } 
    } 

    // alternative 2 
    assertTrue(expectedRows.equals(rows)); 
} 

...

DÜZENLEME dayalı Yorumlarınızdan biri

equals sözleşmesinin bir parçası olmayan alanları kontrol etmek isterseniz, t diye ayarlayın:

public void testRowsToBeRead(){ 
    HashSet<SomeObject> expectedRows = new HasSet<SomeObject(); 
    expectedRows.add(new SomeObject("a", "a1")); 
    expectedRows.add(new SomeObject("b", "b1")); 

    HashSet<SomeObject> rows = new SomeObject().read(); 

    for(SomeObject r : rows) { 
     SomeObject expected = expectedRows.get(r); // equals and hashCode must still match 

     if (expected == null) { 
      // failed 
     } 

     if (!expected.getField1().equals(r.getField1()) && !expected.getField2().equals(r.getField2())) { 
      // failed 
     } 
    } 
} 

Yukarıdaki örnekte SomeObject 'ın equals bu gibi görünebilir, field1 için sadece denetler:

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

soru yok, somut kullanım durumuna bağlı olarak bu daha karmaşık hale gelebilir . Siz de TestNG ile hemen hemen herhangi bir toplama ve muhtemelen JUnit üzerinde Assert.assertEquals() kullanabilirsiniz

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

'equals' ve' hashCode', bu yaklaşımı kullanmak için doğru şekilde uygulanmalıdır (ve HashSet kullanın). – Genzer

+0

@Genzer: Ups, teşekkürler sağol. Cevabı güncelledim ... – home

+0

Eşittir ve hashcode birimi testlerine zaten sahibim, bu yüzden bana tam olarak aradığım şeyi veriyor. – Kapsh

2

Emri garanti LinkedHashSet kullanabilirsiniz.

+0

Teşekkürler. Bu, gerçek yöntemi değiştirmek için bana ihtiyacım var. Gelecekte biraz zaman geçirebilirim, ama şu an sadece birim testimi yapmaya çalışıyorum. – Kapsh

2

deneyin assertThat kullanmak ... Bu yardımcı olur umarım.

Bunu kendiniz yapmak istiyorsanız, gerçek kümenin tüm öğelerini beklenen kümeden kaldırın ve işiniz bittiğinde beklenen kümenin boyutunun sıfır olduğunu belirtin.

2

:

1

Ben kullanılmasını HashSet.equals(Object) öneriyoruz.

javadoc diyor:

Bu uygulama ilk denetler Belirtilen nesne bu seti ise; eğer öyleyse, doğru döner. Ardından, belirtilen nesnenin boyutu, bu kümenin boyutuna eşit olan bir kümedir; değilse, yanlış döndürür. Eğer öyleyse, returnAll ((Koleksiyon) o) değerini döndürür.

Yani "ev" in "alternatif 2" nin yeterli olduğunu düşünüyorum.

artı: HashSet siparişi garanti etmese de, eşit karmalar aynı sıra ve boyuttadır.

İlgili konular