2012-08-15 6 views
0

DbUnit을 사용하여 DAO 계층을 테스트하고 있습니다. XML 데이터 세트에서 데이터베이스를 미리 작성하고 일부 작업을 수행 한 후 알려진 결과에 대해 주장합니다.DbUnit 어설 션 부동 소수점 숫자

Assertion.assertEquals(expectedDataSet, actualDataSet);

데이터 세트 부동 소수점 수와 칼럼을 포함한다. 그런 다음이 열을 비교, 내가 얻을 :

junit.framework.ComparisonFailure: value (table=OrderLine_T, row=2, col=price) expected:<2.99[]> but was:<2.99[0000009536743]>.

값은 동일하지만, 부동 소수점 숫자가 정확히 바이너리 형태로 표현 될 수 없기 때문에, 주장이 실패합니다. JUnit에서 우리는 assertEquals(double expected, double actual, double delta)입니다. 부동 소수점 숫자 비교를 위해 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> 

예상 결과 :

<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" /> 

<!--  Below added --> 
    <Order_T id="3" date="1987-06-07 9:15:10" customer_id="2" /> 
    <OrderLine_T id="3" order_id="3" product_id="1" price="2.99" quantity="2" /> 
    <OrderLine_T id="4" order_id="3" product_id="5" price="3.55" quantity="8" /> 
</dataset> 

코드 :

/* 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); 
    } 

편집 :

은 아마 내가 인 - 사용하고 무엇을 언급 할 필요가 메모리 HSQLDB. 그냥 MySQL을 시도하고 성공적으로 통과합니다.

하는 것은 성공하지 ToleratedDelta 설정 시도 :

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); 

Edit2가 : 내가 만들 = hibernate.hbm2ddl.auto을 사용했다

데이터베이스 스키마를 내보낼 수 있습니다. 후 fredt에서 아이디어를 가지고, 나는 BigDecimal를 내 엔티티에 필드 가격의 유형을 변경 및 추가 열 정밀도와 스케일 PARAMS 추가 :

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

이이 PRICE NUMERIC(10,4)로 변환됩니다합니다. 문제가 해결되었습니다. fredt 덕분입니다.

+0

이 문제를 방지하려면 열을 DECIMAL 또는 NUMERIC으로 정의하고 필요한 정밀도와 배율을 지정하십시오. – fredt

+0

@fredt 고맙습니다. HSQLDB를 mem에서 파일로 변경하고 열을 PRICE DECIMAL (10,2)로 지정하면 작동합니다. 대답 할 댓글을 다시 작성하면 기꺼이 받아 들일 것입니다. – Robertas

답변

0

열이 필수 정밀도 및 소수 자릿수가있는 DECIMAL 또는 NUMERIC으로 정의 된 경우 값에 소수점 이하의 exace 자릿수가 있으므로 문제를 피할 수 있습니다.