usingRecursiveFieldByFieldElementComparator 不工作

usingRecursiveFieldByFieldElementComparator not working

我一直在尝试让下面的代码进行第二次测试。

两者具有相同的负载结构,有效的一个仅使用 Map<>,第二个使用 类。

为什么第一个测试有效而第二个测试无效?

这似乎是 usingRecursiveFieldByFieldElementComparator 的错误。

package com.example.hi;

import com.example.hi.ExampleTest.Foo.Bar;
import lombok.AllArgsConstructor;
import lombok.Value;
import org.junit.jupiter.api.Test;

import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.Comparator;
import java.util.List;
import java.util.Map;

import static java.util.Collections.singletonList;
import static org.assertj.core.api.Assertions.assertThat;

public class ExampleTest {

    Comparator<LocalDateTime> truncateSeconds = (a, exp) ->
        a.isAfter(exp.truncatedTo(ChronoUnit.SECONDS)) ? 0 : 1;

    @Test
    void works() {

        var a = Map.of("values", Map.of("one", singletonList(Map.of("date", LocalDateTime.now()))));
        var b = Map.of("values", Map.of("one", singletonList(Map.of("date", LocalDateTime.now()))));

        assertThat(singletonList(a))
            .usingRecursiveFieldByFieldElementComparator()
            .usingComparatorForElementFieldsWithType(truncateSeconds, LocalDateTime.class)
            .containsExactly(b);
    }

    @Test
    void works_not() {

        var a = new Foo(Map.of("one", singletonList(new Bar(LocalDateTime.now()))));
        var b = new Foo(Map.of("one", singletonList(new Bar(LocalDateTime.now()))));

        assertThat(singletonList(a))
            .usingRecursiveFieldByFieldElementComparator()
            .usingComparatorForElementFieldsWithType(truncateSeconds, LocalDateTime.class)
            .containsExactly(b);
    }

    @Value
    @AllArgsConstructor
    public static class Foo {

        Map<String, List<Bar>> values;

        @Value
        @AllArgsConstructor
        public static class Bar {

            LocalDateTime date;
        }
    }
}

问题已在 AssertJ Core 3.17.0 中修复,以下应该有效:

// static import RecursiveComparisonConfiguration.builder
RecursiveComparisonConfiguration configuration = builder().withIgnoreAllOverriddenEquals(true)
                                                          .withComparatorForType(truncateSeconds, LocalDateTime.class)
                                                          .build();

assertThat(list).usingRecursiveFieldByFieldElementComparator(configuration)
                .containsExactly(b);