2010-05-20 185 views
4

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

我的数据集包含:

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

映射到其中discount_price列被定义为一个订单行的Java对象:

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

然而,当我运行我的测试案例,并断言折扣价格返回等于0.3,断言失败并且说存储值为0.如果我将数据集中的discount_price更改为0.9,则它将舍入为1.

我已经检查过,以确保HSQLDB没有做四舍五入,它绝对不是因为我可以插入一个订单行对象使用Java代码与5.3的值,它工作正常。

对我来说,DBUtils似乎是因为某些原因导致我定义的数字四舍五入。有没有办法我可以强制这个不会发生?任何人都可以解释为什么它可能会这样做?

谢谢!

回答

0

我做了一个快速测试在我身边用DbUnit 2.2.2,HSQLDB 1.8.0.10和Hibernate EM 3.4.0.GA,事情是否按预期工作:

  • DbUnit的正确插入十进制值成类型的discount_pricenumeric(12,2)
  • 休眠正确地读取discount_price值成BigDecimal discountPrice
  • 以下assertEquals(0.3d, orderLine.getDiscountPrice().doubleValue())传递

所以我的问题是:

  • 什么版本的DbUnit你完全使用?
  • 你如何确定你的断言?你也是DbUnit API吗?
1

我有一个类似的问题...固定通过升级到Hibernate 3.6

2

我碰到这个问题跑,因为我是用一个类似的问题在我的当前设置的战斗,可惜我没能升级休眠。所以我找到了一个不需要升级休眠就能解决问题的不同解决方案。认为这不会伤害分享。您只需扩展HSQLDialect

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

这是最好的答案,它适用于我。 – 2015-03-25 09:42:49