2015-10-22 3 views
20

मैं सोच रहा था कि assertEquals(double, double) क्यों बहिष्कृत है।मेरा assertEquals() JUnit में बहिष्कृत क्यों है?

मैंने import static org.junit.Assert.assertEquals; का उपयोग किया और मैंने जुनीट 4.11 का उपयोग किया।

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


public class AccountTest { 

@Test 
public void test() { 
    Account checking = new Account(Account.CHECKING); 
    checking.deposit(1000.0); 
    checking.withdraw(100.0); 
    assertEquals(900.0, checking.getBalance()); 
    } 
} 

checking.getBalance() एक डबल मान देता है:

नीचे मेरी कोड है।

क्या गलत हो सकता है?

+4

यदि आप बस जावाडोक पढ़ते हैं, तो आपको बताया जाएगा कि इसके बजाय क्या उपयोग करना है। – Andreas

उत्तर

35

डबल की सटीक समस्याओं के कारण इसे हटा दिया गया है।

यदि आप ध्यान दें, तो assertEquals(double expected, double actual, double delta) पर एक और तरीका है जो delta सटीक हानि की अनुमति देता है।

JavaDoc:

का दावा है कि दो युगल एक सकारात्मक डेल्टा के भीतर करने के लिए बराबर हैं। यदि वे नहीं हैं, तो एक AssertionError फेंक दिया जाता है। तो उम्मीद मूल्य अनंत है तो डेल्टा मूल्य ignored.NaNs बराबर माना जाता है है: assertEquals(Double.NaN, Double.NaN, *) गुजरता

...

डेल्टा - के बीच अधिकतम डेल्टा की उम्मीद है और वास्तविक है जिसके लिए दोनों संख्या अब भी बराबर माना जाता है।

+0

डेल्टा का एक अच्छा उदाहरण क्या होगा? – jsh6303

+1

@Jiajuhen, यह आपकी गणनाओं पर निर्भर करता है ... मान लें कि यदि आप '5.1 + 0.1' करते हैं, तो आप' 5.2' की अपेक्षा करेंगे लेकिन आउटपुट '5.1999 ...' होगा। तो डेल्टा '0.0001' हो सकता है ... या इससे भी कम ... – Codebender

+0

इसे देखें [उदाहरण] (https://github.com/junit-team/junit/blob/3e43555e1f4df95b0a239f453af6d3226a8fef6e/src/test/java/org jjunit स्रोत कोड से यह /junit/tests/assertion/AssertionTest.java#L285) या यह [उदाहरण] (https://github.com/junit-team/junit/blob/3e43555e1f4df95b0a239f453af6d3226a8fef6e/src/test/java/junit/ परीक्षण/ढांचे/DoublePrecisionAssertTest.java) – Eric

8

assertEquals(double, double) बहिष्कृत किया गया है क्योंकि 2 युगल समान हो सकते हैं लेकिन यदि उनकी गणना की जाती है तो प्रोसेसर उन्हें थोड़ा अलग मूल्य बना सकता है।

यदि आप इसे आजमाते हैं तो यह असफल हो जाएगा: assertEquals(.1 + .7, .8)यह इंटेल® प्रोसेसर का उपयोग करके परीक्षण किया गया था।

deprecated method पर कॉल करने के लिए fail("Use assertEquals(expected, actual, delta) to compare floating-point numbers"); को ट्रिगर किया जाएगा।

+1

उपयोगी उदाहरण। –

9

लोग समझाने लेकिन नमूने देना नहीं है ... तो यहाँ जाता है क्या मेरे लिए काम किया:

@Test 
public void WhenMakingDepositAccountBalanceIncreases() { 
    Account account = new Account(); 
    account.makeDeposit(10.0); 
    assertEquals("Account balance was not correct.", 10.0, account.getBalance(), 0); 
} 

अंत में 0;

+0

0.0 का उपयोग डेल्टा के रूप में बहिष्कृत विधि का उपयोग करने जैसा ही है। डेल्टा का उद्देश्य यह दर्शाता है कि संख्या कितनी करीब हो सकती है और अभी भी बराबर माना जा सकता है। आवेदन को सहन करने में कितनी त्रुटि हो सकती है, इस पर निर्भर करता है कि 0.1 या 0.01 या 0.001, आदि जैसे मानों का उपयोग करें। – downeyt

संबंधित मुद्दे