assertEquals(Object, Object)JUnit4 / JUnitの5から又は assertThat(actual, is(expected));Hamcrestからのみの両方として機能する他の回答で提案equals()とtoString()比較オブジェクトのクラス(深く)するためにオーバーライドされます。
アサーションの等価テストが依存しequals()、テスト失敗メッセージtoString()が比較対象のオブジェクトに依存するため、これは重要です。
用ビルトインのようなクラスString、Integerおよびその...のためにこれらのオーバーライドとして問題はないの両方equals()とtoString()。したがって、アサートList<String>またはList<Integer>とともに使用 することは完全に有効ですassertEquals(Object,Object)。
この問題についてequals()は、JUnitを使用したテストでアサーションを簡単にするだけでなく、オブジェクトの等価性の観点からも意味があるため、クラスでオーバーライドする必要があります。
アサーションを簡単にするには、他の方法があります。
良い方法として、私はアサーション/マッチャーライブラリを優先します。
これがAssertJソリューションです。
org.assertj.core.api.ListAssert.containsExactly() 必要なものです。実際のグループには、javadocに記載されている順序で、指定された値のみが含まれ、他には何も含まれていないことを確認します。
Foo要素を追加し、それを取得できるクラスを想定します。
その単体テストFooは、2つのリストが同じ内容であると断言します。
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の良い点は、List期待どおりにを宣言する必要がないことです。これにより、アサーションがより簡潔になり、コードが読みやすくなります。
Assertions.assertThat(foo.getElements())
.containsExactly("One", "Two", "Three");
しかし、アサーション/マッチャーライブラリーは本当に必要になるため、必須です。
今でFoo はStringsではなくBarsインスタンスを格納するとします。
それは非常に一般的なニーズです。AssertJを使用しても、アサーションの記述は簡単です。equals()/hashCode()JUnitがそれを必要とする一方で要素のクラスがオーバーライドしない場合でも、リストのコンテンツが等しいと断言できるほうがよいでしょう。
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最近は好きです。と組み合わせて使用しList#toArrayます。