使用 unitils ReflectionComparator 忽略字符串中的大小写

Ignoring case in strings with unitils ReflectionComparator

我正在使用 unitils 工具进行深度对象比较,通过 ReflectionComparator:

ReflectionComparatorMode[] modes = {ReflectionComparatorMode.LENIENT_ORDER, ReflectionComparatorMode.IGNORE_DEFAULTS};
ReflectionComparator comparator = ReflectionComparatorFactory.createRefectionComparator(modes);
Difference difference = comparator.getDifference(oldObject, newObject);

原来 ReflectionComparator 不会忽略 String 字段值中的大小写。 ReflectionComparatorMode 枚举中没有用于此目的的特殊模式:

public enum ReflectionComparatorMode {
    IGNORE_DEFAULTS,
    LENIENT_DATES,
    LENIENT_ORDER
}

有什么想法,如何实现?

ReflectionComparatorMode 没有模仿 ignore_case 行为的模式。 您没有指定 oldObjectnewObject 的类型,但我想您可以在将它们传递给 ReflectionComparator 之前对它们进行“规范化”(将所有String 字段为大写或小写)或根据 oldObjectnewObject.

的特定类型实现您自己的 Java 比较器

查看 this

ReflectionComparator 工作原理的调查为我提供了这个可行的解决方案。简而言之,我们必须添加另一个特殊的 Comparator 对象来处理比较器链中的 String 对象。

我们还必须做一些 bedlam,从 ReflectionComparatorFactory 中提取一个需要的 protected 静态方法,以减少代码重复。

ReflectionComparatorMode[] modes = {ReflectionComparatorMode.LENIENT_ORDER, ReflectionComparatorMode.IGNORE_DEFAULTS};

List<org.unitils.reflectionassert.comparator.Comparator> comparators = new ArrayList<>();
    comparators.add(new Comparator() {
         @Override
         public boolean canCompare(Object left, Object right) {
               return left instanceof String && right instanceof String;
         }

         @Override
         public Difference compare(Object left, Object right, boolean onlyFirstDifference, ReflectionComparator reflectionComparator) {
               return  ((String) left).equalsIgnoreCase((String) right) ? null : new Difference("Non equal values: ", left, right);
         }
});

comparators.addAll(
    new ReflectionComparatorFactory() {
        public List<Comparator> getComparatorChainNonStatic(Set<ReflectionComparatorMode> modes) {
               return getComparatorChain(modes);
        }
    }.getComparatorChainNonStatic(asSet(modes)));

ReflectionComparator comparator = new ReflectionComparator(comparators);