2017-05-25 47 views
3

我測試我的方法之一,double getSqrt(double s),並具有以下JUnit測試代碼:爲什麼我的assertEquals不起作用?

@Test 
public void testGetSqrt() { 
    System.out.println("getSqrt"); 
    double s = 16.0; 
    Calculator instance = new Calculator(); 
    double expResult = 4.0; 
    double result = 4.000000000052429; // was "instance.getSqrt(s);" here 
             // now hardcode for test purpose 
    System.out.println(System.getProperty("java.class.path")); 
    assertEquals(expResult, result, 0.0); 
} 

它每次都失敗,無論我如何改變容忍「0.0」,「0.1」,「0.00」 ,「0.01」,「0.001」....該報告如下:

AssertionFailedError: expected:<4.0>; but was:<4.000000000052429>

我使用的是JUnit 4.12和Hamcrest 1.3。

而且我進口:

import org.junit.Test; 
import static org.junit.Assert.*; 

難道我用的是寬容錯了嗎?

輸出在控制檯上:

compile-test-single: 
Testsuite: descriptivestatisticsapplication.processing.CalculatorTest 
getSqrt 
Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.079 sec 

------------- Standard Output --------------- 

getSqrt 

C:\Java\jdk1.8.0_111\jre\lib\javaws.jar;C:\Java\jdk1.8.0_111\jre\lib\deploy.jar;C:\Java\jdk1.8.0_111\jre\lib\plugin.jar;C:\Users\Z\Documents\NetBeansProjects\DescriptiveStatisticsApplication\build\classes;C:\Program Files\NetBeans 8.2\platform\modules\ext\junit-4.12.jar;C:\Program Files\NetBeans 8.2\platform\modules\ext\hamcrest-core-1.3.jar;C:\Users\Z\Documents\NetBeansProjects\DescriptiveStatisticsApplication\build\test\classes;C:\Program Files\NetBeans 8.2\extide\ant\lib\ant-launcher.jar;C:\Program Files\NetBeans 8.2\extide\ant\lib\ant.jar;C:\Program Files\NetBeans 8.2\extide\ant\lib\ant-junit.jar;C:\Program Files\NetBeans 8.2\extide\ant\lib\ant-junit4.jar 

------------- ---------------- --------------- 

更新的5/27:

做從意見建議一些測試後,該單元測試現在可以順利通過。我認爲這個問題可以結束。

我擔心的是我沒有找到任何失敗原因,爲什麼現在它成功了!相同的代碼,相同的邏輯!我所做的唯一事情就像註釋掉一些不重要的行,然後將它們添加回來,更改一些聲明語句序列,然後將其更改回來。相同的代碼有不同的行爲。我沒有改變建築物中的任何東西,並運行env和libs。這沒有任何意義。一段代碼的結果應該是可重現的。

+0

在你的'getSqrt'方法裏面,你是如何計算平方根的? –

+1

@BiancaRosa重要嗎?我們可以看到結果。 –

+0

@BiancaRosa getSqrt的實現不應該是相關的。正如你所看到的,它已經計算出結果<4.000000000052429>。這當然不準確,因爲我使用Double。問題是,我已經將精度容限限制爲0.01,但它仍然不起作用。我想不出爲什麼...... –

回答

-1

Java中的浮動並不準確,因爲你已經看到了結果< 4.000000000052429> 換句話說,你設定一個浮點數在Java 4,它實際上不是4 您可以使用或長甚至BigInteger來解決這個問題。

+2

這就是容差所做的 - 給你一個錯誤的餘地。 –