Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Testing DbUnit断言浮点数_Testing_Hsqldb_Dbunit - Fatal编程技术网

Testing DbUnit断言浮点数

Testing DbUnit断言浮点数,testing,hsqldb,dbunit,Testing,Hsqldb,Dbunit,我正在使用DbUnit测试我的DAO层。我从XML数据集中预先填充数据库,执行一些操作,然后根据已知结果断言 Assertion.assertEquals(预期数据集、实际数据集) 数据集包含带有浮点数的列。然后比较这些列,我得到: junit.framework.ComparisonFailure:value(table=OrderLine\u T,row=2,col=price)预期值:但为:。 这些值是相等的,但由于浮点数不能以二进制形式精确表示,因此断言失败。 在JUnit中,我们有as

我正在使用DbUnit测试我的DAO层。我从XML数据集中预先填充数据库,执行一些操作,然后根据已知结果断言

Assertion.assertEquals(预期数据集、实际数据集)

数据集包含带有浮点数的列。然后比较这些列,我得到:

junit.framework.ComparisonFailure:value(table=OrderLine\u T,row=2,col=price)预期值:但为:。

这些值是相等的,但由于浮点数不能以二进制形式精确表示,因此断言失败。 在JUnit中,我们有
assertEquals(双预期、双实际、双增量)
。如何在DbUnit中设置一些增量以进行浮点数比较

初始数据集:

<dataset>
    <Customer_T id="1" name="Anthony"/>
    <Customer_T id="2" name="John"/>

    <Order_T id="1" date="2012-06-07 14:30" customer_id="1" />
    <Order_T id="2" date="2012-06-07 15:31" customer_id="2" />

    <OrderLine_T id="1" order_id="1" product_id="1" price="2.99" quantity="5" />
    <OrderLine_T id="2" order_id="2" product_id="2" price="3.49" quantity="10" />
</dataset>
编辑2:

我使用hibernate.hbm2ddl.auto=create将模式导出到数据库。从fredt获得想法后,我将实体上的字段价格类型更改为BigDecimal,并添加了额外的列精度和比例参数:

@Column(precision=10, scale=4)
private BigDecimal price;

这将转换为
价格数字(10,4)
。问题解决了,多亏了fredt

如果列被定义为十进制或具有所需精度和刻度的数字,则该值将在小数点后有一个exace数字,可以避免此问题。

为了避免此问题,您可以按要求的精度和比例将列定义为十进制或数字。@fredt谢谢。将HSQLDB从mem更改为file,将列指定为PRICE DECIMAL(10,2),它可以工作。如果你重新写下你的评论来回答,我将很乐意接受。
/* Should save order correctly (including order lines) */
    @Test
    public void save() throws Exception {
        /* Create new order */
        Set<OrderLine> lines = new HashSet<OrderLine>();
        lines.add(new OrderLine(1, (float)2.99, 2));
        lines.add(new OrderLine(5, (float)3.55, 8));

        Calendar cal = Calendar.getInstance();
        cal.set(1987, 6, 7, 9, 15, 10);
        Date date = cal.getTime();

        Customer customer = customerDAO.findById(2); // John

        Order order = new Order(date, lines, customer);
        orderDAO.save(order);
        entityManager.flush();

        /* Assert order is saved */
        IDataSet expectedDataSet = new FlatXmlDataSetBuilder().build(Thread.currentThread()
                                                                           .getContextClassLoader()
                                                                           .getResourceAsStream("data-set-afterAddOrder.xml"));
        IDataSet actualDataSet = getDatabaseConnection().createDataSet();

        Assertion.assertEquals(expectedDataSet, actualDataSet);
    }
IDatabaseConnection connection = new DatabaseConnection(((SessionImpl) (entityManager.getDelegate())).connection());
HsqldbDataTypeFactory dataTypeFactory = new HsqldbDataTypeFactory();
dataTypeFactory.addToleratedDelta(new ToleratedDelta("OrderLine_T", "price", 0.01));
connection.getConfig().setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY, dataTypeFactory);
@Column(precision=10, scale=4)
private BigDecimal price;