使用DbUnit将BigDecimal数据放入HSQLDB测试数据库

时间:2010-05-20 08:47:20

标签: hibernate testing hsqldb dbunit

我在后端使用Hibernate JPA。我正在使用JUnit和DBUnit编写单元测试,以将一组数据插入到内存中的HSQL数据库中。

我的数据集包含:

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

映射到OrderLine Java对象,其中discount_price列定义为:

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

但是,当我运行我的测试用例并声明返回的折扣价格等于0.3时,断言失败并表示存储的值为0.如果我将数据集中的discount_price更改为0.9,则它会向上舍入为1

我已经检查过以确保HSQLDB没有进行舍入,这肯定不是因为我可以使用类似5.3的值的Java代码插入订单行对象,并且它工作正常。

对我来说,似乎DBUtils由于某种原因舍入了我定义的数字。有没有办法可以迫使这种情况发生?任何人都可以解释为什么它可能会这样做吗?

谢谢!

3 个答案:

答案 0 :(得分:3)

我遇到了这个问题,因为我遇到了类似的问题,不幸的是在我目前的设置中,我无法升级hibernate。所以我找到了一个不同的解决方案来解决问题而无需升级hibernate。认为分享不会有害。您只需扩展HSQLDialect

即可
public class HSQLNumericWithPrecisionDialect extends HSQLDialect {
    public HSQLNumericWithPrecisionDialect() {
        super();
        registerColumnType( Types.NUMERIC, "numeric($p, $s)" );
    }
}

答案 1 :(得分:1)

我有一个类似的问题......通过升级到Hibernate 3.6来修复

答案 2 :(得分:0)

我使用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吗?