assertEquals(Object, Object)
JUnit4 dan / JUnit 5 veya assertThat(actual, is(expected));
hamcrest hem sadece çalışacak diğer yanıtlar önerilen equals()
vetoString()
kıyasla nesne sınıflarının (ve derin) için overrided edilir.
Önemdeki eşitlik testi equals()
ve test başarısızlık mesajı toString()
karşılaştırılan nesnelere dayandığı için önemlidir .
Gibi yerleşik sınıflar için String
, Integer
vb. İçin sorun değil, çünkü bu ikisini de geçersiz kılar equals()
ve toString()
. Bu nedenle iddia etmek List<String>
ya List<Integer>
da iddia etmek için mükemmel bir şekilde geçerlidir assertEquals(Object,Object)
.
Ve bu konuda: equals()
bir sınıfta geçersiz kılmalısınız çünkü nesne eşitliği açısından mantıklıdır, sadece JUnit ile yapılan bir testte iddiaları kolaylaştırmak için değil.
İddiaları kolaylaştırmak için başka yollarınız da var.
İyi bir uygulama olarak iddia / eşleştirme kütüphanelerini tercih ediyorum.
İşte bir AssertJ çözümü.
org.assertj.core.api.ListAssert.containsExactly()
İhtiyacınız olan şey budur: javadoc'ta belirtildiği gibi, gerçek grubun tam olarak verilen değerleri ve başka hiçbir şey içermediğini doğrular.
Diyelim ki, Foo
eleman eklediğiniz ve bunu alabileceğiniz bir sınıf.
Bu birim testi Foo
, iki listenin aynı içeriğe sahip olabileceğini iddia eder:
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
@Test
void add() throws Exception {
Foo foo = new Foo();
foo.add("One", "Two", "Three");
Assertions.assertThat(foo.getElements())
.containsExactly("One", "Two", "Three");
}
AssertJ iyi bir nokta, a'nın List
beklendiği gibi bildirilmesinin gereksiz olmasıdır: bu, iddiayı daha da zorlaştırır ve kodu daha okunabilir kılar:
Assertions.assertThat(foo.getElements())
.containsExactly("One", "Two", "Three");
Ancak, iddia / eşleştirici kütüphaneleri bir zorunluluktur, çünkü bunlar gerçekten daha da ilerleyecektir.
Şimdi varsayalım s değil s örneklerini Foo
saklayın .
Bu çok yaygın bir ihtiyaç. AssertJ ile iddianın yazılması hala basittir. Daha iyisi, JUnit yolu aşağıdakileri gerektirirken öğelerin sınıfı geçersiz kılmasa bile liste içeriğinin eşit olduğunu iddia edebilirsiniz :String
Bar
equals()/hashCode()
import org.assertj.core.api.Assertions;
import static org.assertj.core.groups.Tuple.tuple;
import org.junit.jupiter.api.Test;
@Test
void add() throws Exception {
Foo foo = new Foo();
foo.add(new Bar(1, "One"), new Bar(2, "Two"), new Bar(3, "Three"));
Assertions.assertThat(foo.getElements())
.extracting(Bar::getId, Bar::getName)
.containsExactly(tuple(1, "One"),
tuple(2, "Two"),
tuple(3, "Three"));
}
assertArrayEquals
Bugünlerde kullanmayı seviyorum . İle birlikte kullanınList#toArray
.