Почему FieldByFieldComparator из assertJ не работает? - PullRequest
0 голосов
/ 03 июня 2018

Я пытался использовать FieldByFieldComparator из AssertJ при сравнении двух списков элементов JavaBeans с полями BigDecimals, и это не работает.Когда я сравниваю эти два BigDecimals (например, 1.00 и 1.000000), используя компаратор BigDecimal по умолчанию, утверждение не терпит неудачу (потому что они равны по сравнению с).

Я также написал свой собственный BeansFieldByFieldComparator, и это работает, ноИнтересно, было ли это необходимо, потому что такой компаратор включен в AssertJ, может быть, я использую его неправильно?но все указывает на то, что я прав - это не работает.

JavaBean-код:

@Value
public static class Foo {
    BigDecimal bar;
}

Утверждение, которое не работает:

assertThat(asList(new Foo(new BigDecimal("1.000"))))
.usingFieldByFieldElementComparator()
.containsOnlyElementsOf(asList(new Foo(new BigDecimal("1.0000000"))));

ПочемуFieldByFieldComparator не работает?Заранее спасибо за любую помощь:)

1 Ответ

0 голосов
/ 03 июня 2018

Причина в том, что он использует метод BigDecimal equals для сравнения bar полей и BigDecimal равно дифференцировать 2.0 от 2.00 ( с использованиемFieldByFieldElementComparator состояния javadocэти поля сравниваются с equals).

Чтобы передать утверждение, вы можете указать, как утверждение должно сравнивать BigDecimal с usingComparatorForType, например:

assertThat(asList(new Foo(new BigDecimal("1.000"))))
         .usingFieldByFieldElementComparator()
         .usingComparatorForType(BIG_DECIMAL_COMPARATOR, BigDecimal.class)
         .containsOnlyElementsOf(asList(new Foo(new BigDecimal("1.0000000"))));

где BIG_DECIMAL_COMPARATOR - это Comparator<BigDecimal>, реализованный путем вызова метода BigDecimal compareTo, см. org.assertj.core.util.BigDecimalComparator.

...