リストの完全一致の比較検証を簡単に記述できないかを考える。
比較対象のリストの要素がデータオブジェクトで、特定のフィールドは
比較対象にしたくない。というケース
オブジェクトの比較対象にしたくないフィールドをコピーすることを以下を
使って簡単に記述すれば良い。
github.com
private <T> void assertList(List<T> actlist, List<T> expectedlist, String...excludes) { Assert.assertTrue(actlist.size()==expectedlist.size()); List<String> expects = IntStream.range(0, actlist.size()).boxed().map(i->{ T act = actlist.get(i); T exp = expectedlist.get(i); for(String name:excludes){ FieldCopy.of(u->name, exp).accept(act); } return exp; }).map(t->t.toString()) .sorted() .collect(Collectors.toList()); List<String> reals = actlist.stream().map(t->t.toString()).sorted().collect(Collectors.toList()); MatcherAssert.assertThat(reals, CoreMatchers.is(expects)); }
actlist = 検証したいリスト
expectedlist = 期待値リスト
excludes = 可変長引数で、比較対象から除外するフィールドの名称を指定する
以下がテストの条件になる。
- リストの要素は、toString() を実装して比較することができる。
- null でないこと。
果たしてこれでいくつものリストの比較検証を書くのにステップが多くならない
効果に見合うだろうか。。。