web-dev-qa-db-ja.com

assertJを使用して、指定されたフィールドを無視して再帰的に比較するにはどうすればよいですか?

AssertJにはisEqualToIgnoringGivenFieldsisEqualToComparingFieldByFieldRecursivelyがあります。

ただし、一部のフィールドを無視して2つのオブジェクトを再帰的に比較する方法はありません。 this の議論によると、開発中である必要があります。

再帰的に比較するためにアサートの戻り値を取得する方法。ただし、一部のフィールドは無視します。他のライブラリでそれは可能ですか、それともAssertJを使用してどうにかしてそれを行うことができますか?

8
Tarun Maganti

一部のフィールドを無視することはできませんでしたが、無視したいフィールドのコンパレータを導入して一時的に解決し、常にtrueと評価しました。これは流暢ではありませんが、仕事を成し遂げるための一時的な解決策です。

assertThat(object).usingComparatorForFields((x,y)->0,"field1","field2").isEqualToComparingFieldByFieldRecursively(expectedObject);

これには、2017年4月13日現在の 問題 があります。 動作しません コンパレータが比較しようとしているフィールドがnullの場合。これは、オブジェクトの1つがnullの場合、両方がnullの場合ではない場合に問題になります。

8
Tarun Maganti

AssertJリリース3.12.0の最新の「再帰的比較APIの改善」により、再帰的比較を実行してフィールドを無視できるようになりました。

Assertions.assertThat(objActual)
                .usingRecursiveComparison()
                .ignoringFields("uniqueId", "otherId")
                .ignoringFieldsMatchingRegexes(".*someId")
                .ignoringOverriddenEqualsForTypes(MyData.class, MyDataItem.class)
                .isEqualTo(objExpected);
13
Ovidiu Nistor