Размещение данных BigDecimal в тестовой базе данных HSQLDB с использованием DbUnit - PullRequest
5 голосов
/ 20 мая 2010

Я использую Hibernate JPA в своем бэкэнде. Я пишу модульный тест с использованием JUnit и DBUnit для вставки набора данных в базу данных HSQL в памяти.

Мой набор данных содержит:

<order_line order_line_id="1" quantity="2" discount_price="0.3"/>

Что отображается в Java-объект OrderLine, где столбец discount_price определен как:

@Column(name = "discount_price", precision = 12, scale = 2)
private BigDecimal discountPrice;

Однако, когда я запускаю свой тестовый пример и утверждаю, что возвращенная цена со скидкой равна 0,3, утверждение не выполняется и говорит, что сохраненное значение равно 0. Если я изменяю discount_price в наборе данных на 0,9, оно округляется до 1 .

Я проверил, чтобы HSQLDB не выполнял округление, и это определенно не потому, что я могу вставить объект строки заказа, используя код Java со значением, подобным 5.3, и он отлично работает.

Мне кажется, что DBUtils по какой-то причине округляет число, которое я определил. Есть ли способ, которым я могу заставить это не произойти? Кто-нибудь может объяснить, почему он это делает?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 16 октября 2014

Я столкнулся с этим вопросом, так как боролся с подобной проблемой, к сожалению, в моей текущей настройке я не могу обновить спящий режим. Поэтому я нашел другое решение, которое решает проблему без необходимости обновлять спящий режим. Думал, что не будет вреда, чтобы поделиться. Вы просто расширяете HSQLDialect

public class HSQLNumericWithPrecisionDialect extends HSQLDialect {
    public HSQLNumericWithPrecisionDialect() {
        super();
        registerColumnType( Types.NUMERIC, "numeric($p, $s)" );
    }
}
1 голос
/ 21 июля 2011

У меня была похожая проблема ... исправлена ​​при обновлении до Hibernate 3.6

0 голосов
/ 20 мая 2010

Я провел быстрый тест на моей стороне с DbUnit 2.2.2, HSQLDB 1.8.0.10 и Hibernate EM 3.4.0.GA, и все работает как положено:

  • DbUnit правильно вставляет десятичные значения в столбец discount_price типа numeric(12,2)
  • Hibernate правильно читает значения discount_price в BigDecimal discountPrice
  • следующие assertEquals(0.3d, orderLine.getDiscountPrice().doubleValue()) проходят

Итак, мои вопросы:

  • Какую версию DbUnit вы используете точно?
  • Как вы точно утверждаете? Вы тоже DbUnit API для этого?
...