【问题标题】:How to compare LISTS recursively ignoring given fields using assertJ?如何使用assertJ递归地比较列表忽略给定的字段?
【发布时间】:2021-09-23 16:25:22
【问题描述】:

首先,这不是this question 的副本。在那里,它被专门要求一个对象。我想为一个容器做这个,特别是一个列表。

所以,我知道我可以在使用时忽略一个字段 usingElementComparatorIgnoringFields() 但这不会进行递归比较。

我知道我可以使用usingRecursiveFieldByFieldElementComparator()。但这不允许我排除给定的字段。

如何递归比较,忽略一个字段?

【问题讨论】:

    标签: java unit-testing assertj


    【解决方案1】:

    这将出现在下一个 AssertJ Core 版本中:https://github.com/joel-costigliola/assertj-core/issues/1002

    【讨论】:

      【解决方案2】:

      同时你可以这样写:

      assertThat(actualList)
                  .usingElementComparator(recursiveIgnoringComparator("excludedField1", "excludedField2", "excludedField3"))
                  .containsExactlyInAnyOrder(expectedList);
      }
      
      private Comparator<T> recursiveIgnoringFieldsComparator(String... fieldNames) {
          final Map<String, Comparator<?>> comparatorByPropertyOrField =
                  Arrays.stream(fieldNames)
                          .collect(toMap(
                                  name -> name,
                                  name -> (o1, o2) -> 0
                          ));
      
          return new RecursiveFieldByFieldComparator(comparatorByPropertyOrField, new TypeComparators());
      }
      

      【讨论】:

        【解决方案3】:

        @Arkadiusz 示例对我不起作用。此外,我在列表方面遇到了递归问题,因此我的解决方案是针对这种情况量身定制的。所以我所做的是(Kotlin 代码):

        private fun recursiveListComparatorFactory(vararg ignoreFields: String): Comparator<List<*>> {
            return Comparator { o1, o2 ->
                assertThat(o1).hasSameSizeAs(o2)
                for (i in o1.indices) {
                    assertThat(o1[i]).usingComparatorForType(recursiveListComparatorFactory(*ignoreFields), List::class.java).isEqualToIgnoringGivenFields(o2[i], *ignoreFields)
                }
                0 // return
            }
        }
        

        然后只需调用:

        val ignoreFields = ["id", "version"]
        assertThat(o1).usingComparatorForType(recursiveListComparatorFactory(ignoreFields), List::class.java).isEqualToIgnoringGivenFields(o2, ignoreFields)
        

        【讨论】:

          猜你喜欢
          • 2017-09-05
          • 1970-01-01
          • 2019-05-11
          • 1970-01-01
          • 2013-11-18
          • 2011-10-06
          • 2014-11-04
          • 2014-02-22
          • 1970-01-01
          相关资源
          最近更新 更多