JUnit iddialarındaki dizileri karşılaştırmak, özlü yerleşik bir yol mu?


159

JUnit'teki benzer türden iki dizide eşit beyanda bulunmanın özlü ve yerleşik bir yolu var mı? Varsayılan olarak (en azından JUnit 4'te) dizi nesnesinin kendisinde bir örnek karşılaştırması yapıyor gibi görünüyor.

EG, çalışmıyor:

int[] expectedResult = new int[] { 116800,  116800 };
int[] result = new GraphixMask().sortedAreas(rectangles);
assertEquals(expectedResult, result);

Tabii ki, manuel olarak yapabilirim:

assertEquals(expectedResult.length, result.length);
for (int i = 0; i < expectedResult.length; i++)
    assertEquals("mismatch at " + i, expectedResult[i], result[i]);

..ama daha iyi bir yol var mı?

Yanıtlar:


298

Org.junit.Assert'in yöntemini kullanın assertArrayEquals:

import org.junit.Assert;
...

Assert.assertArrayEquals( expectedResult, result );

Bu yöntem kullanılamıyorsa, yanlışlıkla Assert sınıfını içeri aktarmış olabilirsiniz junit.framework.


ama farklı uzunluk için başarısız olduğunda elde edeceğiniz tek şey java.lang.AssertionError: array lengths differed, expected.length=6 actual.length=7. Çoğu JUnit hata mesajı olarak o kadar yararlı değil ... Bazı bir iddia çerçevesi kullanmanızı tavsiye ediyorum
user1075613

1
@ user1075613 - Yararlı buluyorum. Dizilerin eşit olduğunu iddia ettik, öyle değiller ve bize bunun nedeninin bir göstergesi verildi. Oradan bir kesme noktası belirleyebilir ve dizileri ayrıntılı olarak inceleyebiliriz.
Andy Thomas

1
doğru, bu - biraz - yararlı. Ancak, işaret ettiğinizde, bu iletiyi alır almaz kendinize "neden aynı uzunlukta değil?" böylece içeriği kontrol etmek istersiniz. İyi bir hata mesajı doğrudan söyleyebiliyorsa neden hata ayıklayıcı ile zaman kaybediyorsunuz? (bazen hata ayıklayıcıya hala ihtiyaç duyduğunuzdan emin olun, ancak çoğu zaman istemezsiniz)
user1075613

Sorunları JUnit'in sorun izleme sistemine gönderebilirsiniz . Bununla birlikte, 1) hızlı başarısız olmanın O (1) 'de bir avantaj olabileceğini, 2) iddianın başarısızlık çıktısının O (n) olmaması gerektiğini unutmayın. JUnit sorun izleme sistemi daha fazla tartışma için daha iyi bir forumdur.
Andy Thomas

1
@anddero - Assert.assertFalse( Arrays.equals( expectedResult, result )).
Andy Thomas

35

Şunları kullanabilirsiniz Arrays.equals(..):

assertTrue(Arrays.equals(expectedResult, result));

14
Bununla ilgili kötü olan şey, başarısız olduğunda neyin yanlış olduğuna dair NO verileri almanızdır.
mBria

8
Eski bir junit sürümündeyken güzel (Android'de olduğu gibi)
Zitrax

2
Hangi baytların eşleşmediğini görmek istiyorsanız, bunları dizeye dönüştürebilirsiniz: assertEquals (Arrays.toString (beklenenResult), Arrays.toString (sonuç));
Erdem

17

Dizileri dizelere dönüştürmeyi tercih ederim:

Assert.assertEquals(
                Arrays.toString(values),
                Arrays.toString(new int[] { 7, 8, 9, 3 }));

bu şekilde yanlış değerlerin nerede olduğunu açıkça görebiliyorum. Bu yalnızca küçük boyutlu diziler için etkili bir şekilde çalışır, ancak birim testlerimde 7'den fazla öğe içeren dizileri nadiren kullanırım.

Bu yöntem, ilkel türler ve aşırı yüklerin toStringtüm gerekli bilgileri döndürdüğü diğer türler için çalışır .



4

Junit4 ve Hamcrest kullanarak dizileri karşılaştırmak için özlü bir yöntem elde edersiniz. Ayrıca hatanın hata izlemesinde nerede olduğuna dair ayrıntılar verir.

import static org.junit.Assert.*
import static org.hamcrest.CoreMatchers.*;

//...

assertThat(result, is(new int[] {56, 100, 2000}));

Arıza İzi çıkışı:

java.lang.AssertionError: 
   Expected: is [<56>, <100>, <2000>]
   but: was [<55>, <100>, <2000>]

2

Sorunun JUnit4 için olduğunu biliyorum, ancak JUnit3'te sıkışıp kalırsanız, böyle kısa bir yardımcı program işlevi oluşturabilirsiniz:

private void assertArrayEquals(Object[] esperado, Object[] real) {
    assertEquals(Arrays.asList(esperado), Arrays.asList(real));     
}

JUnit3'te bu, dizileri doğrudan karşılaştırmaktan daha iyidir, çünkü tam olarak hangi öğelerin farklı olduğunu ayrıntılı olarak açıklayacaktır.

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.