AssertJ не может подтвердить равенство BigDecimal без масштабирования

Я использую такие утверждения:

assertThat(obj.getTotal()).isEqualTo(BigDecimal.valueOf(4))

я осознаю

Ожидая: ‹4.00›, чтобы быть равным: ‹4›

Итак, я попробовал

assertThat(obj.getTotal()).isEqualTo(BigDecimal.valueOf(4.00))

Ожидается, что: ‹4.00› будет равно: ‹4.0›

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


person 夢のの夢    schedule 02.09.2020    source источник
comment
Основная проблема заключается не в AssertJ, а в том, что BigDecimal имеет странное определение своего equal метода.   -  person Joachim Sauer    schedule 03.09.2020


Ответы (2)


Вы можете использовать isEqualByComparingTo или usingComparator, которые используют BigDecimal.compareTo, который сравнивает фактическое числовое значение. Метод equals, который используется assertj по умолчанию, выполняет следующие действия в соответствии с JavaDoc:

В отличие от compareTo, этот метод считает два объекта BigDecimal равными, только если они равны по значению и масштабу (таким образом, 2,0 не равно 2,00 при сравнении с помощью этого метода).

Итак, вы можете:

    assertThat(obj.getTotal())
        .usingComparator(BigDecimal::compareTo)
        .isEqualTo(BigDecimal.valueOf(4.00));

или просто:

assertThat(obj.getTotal())
    .isEqualByComparingTo(BigDecimal.valueOf(4.00));

Для использования с утверждениями Iterable и extracting:

    assertThat(asList(new Trade("1", new BigDecimal("5.200")), new Trade("2", new BigDecimal("4.00"))))
        .extracting(Trade::getId, Trade::getAmount)
        .usingComparatorForType(BigDecimal::compareTo, BigDecimal.class)
        .usingRecursiveFieldByFieldElementComparator()
        .containsExactlyInAnyOrder(tuple("1", new BigDecimal("5.2")), tuple("2", new BigDecimal("4")));
person Marimuthu Madasamy    schedule 03.09.2020
comment
Именно поэтому доступно утверждение isEqualByComparingTo. - person Joel Costigliola; 04.09.2020
comment
Однако это не удается при сравнении итерации с извлечением с помощью кортежей :( - person Kango_V; 25.06.2021
comment
@Kango_V Вы можете использовать usingComparatorForType для утверждения Iterables с extracting. Я обновил ответ примером для него. - person Marimuthu Madasamy; 26.06.2021

Попробуйте java.math.BigDecimal.stripTrailingZeros() метод, например:

// AssertJ
assertThat(obj.getTotal().stripTrailingZeros()).isEqualTo(BigDecimal.valueOf(4));

// Junit
assertEquals(BigDecimal.valueOf(4), obj.getTotal().stripTrailingZeros());
person Peter Quan    schedule 03.09.2020
comment
Почему этот ответ получил отрицательную оценку ?? - person Peter Quan; 04.09.2020