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
はString
sではなくBar
sインスタンスを格納するとします。
それは非常に一般的なニーズです。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
ます。