1. ホーム
  2. java

[解決済み] 2つのList<E>が同じ要素を同じ順序で含んでいることをJUnitでテストするにはどうすればよいですか?

2023-06-08 17:38:25

質問

文脈

私は単純な JUnit のテストは MyObject クラスのテストを行います。

A MyObject は静的なファクトリーメソッドから作成することができます。 文字列 .

MyObject.ofComponents("Uno", "Dos", "Tres");

が存在する間、いつでも MyObject が存在する間、クライアントはそれが作られた時のパラメータを リスト<E> を通して .getComponents() メソッドを使用します。

myObject.ofComponents(); // -> List<String>: { "Uno", "Dos", "Tres" }

つまり MyObject は、それを生成したパラメータのリストを記憶し、公開しているのです。このコントラクトの詳細。

  • の順序は getComponents の順序は、オブジェクトの作成時に選択されたものと同じになります。
  • 後続の複製 文字列 コンポーネントは許可され、順番に保持されます
  • の動作は null は未定義です(他のコードでは null がファクトリーに到達しないことを保証します)
  • オブジェクトのインスタンス化の後、コンポーネントのリストを変更する方法はありません。

を作成する簡単なテストを書いています。 MyObject のリストから 文字列 で、同じリストを返すことができるかどうかチェックします。 .getComponents() . 私はすぐにこれを行いますが、これは現実的なコードパスで離れた場所で起こるはずのものです。 .

コード

私の試みは以下の通りです。


List<String> argumentComponents = Lists.newArrayList("One", "Two", "Three");
List<String> returnedComponents =
    MyObject.ofComponents(
        argumentComponents.toArray(new String[argumentComponents.size()]))
        .getComponents();
assertTrue(Iterables.elementsEqual(argumentComponents, returnedComponents));


質問

  • グーグル グアバ Iterables.elementsEqual() ビルドパスにライブラリがある場合、これらの 2 つのリストを比較する最良の方法は? を越えるこのヘルパーメソッドを使うべきでしょうか? Iterable<E> ...サイズをチェックし、そして実行中のイテレーション .equals() ...またはインターネット検索が示唆する他のメソッド? ユニットテストのためにリストを比較するための標準的な方法は何ですか?

私が得たいオプションの洞察

  • メソッドテストは合理的に設計されているか?の専門家ではありません。 JUnit !
  • .toArray() を変換するのに最適な方法です。 リスト<E> を E の varargs に変換しますか?

どのように解決するには?

Hamcrestを使用する方が、失敗した場合の出力がはるかに良いので、私は好んで使用します

Assert.assertThat(listUnderTest, 
       IsIterableContainingInOrder.contains(expectedList.toArray()));

報告の代わりに

expected true, got false

報告されます

expected List containing "1, 2, 3, ..." got list containing "4, 6, 2, ..."

IsIterableContainingInOrder.contain。

Hamcrest

Javadocによると

Iterable を一度だけ検査し、指定された項目の中の対応する項目と論理的に等しい一連の項目を生成したときにマッチする Iterable 用の matcher を作成します。正のマッチの場合、検査された Iterable は指定された項目の数と同じ長さである必要があります。

そのため listUnderTest は同じ数の要素を持ち、各要素は順番に期待される値と一致しなければなりません。