2010-05-20 54 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