जावा ज्यूनीट: विधि X टाइप Y के लिए अस्पष्ट है


98

मेरे पास कुछ परीक्षण ठीक काम कर रहे थे। फिर, मैंने इसे एक अलग पैकेज में स्थानांतरित कर दिया, और अब मुझे त्रुटियां हो रही हैं। यहाँ कोड है:

import static org.junit.Assert.*;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

import org.jgrapht.Graphs;
import org.jgrapht.WeightedGraph;
import org.jgrapht.graph.DefaultWeightedEdge;
import org.jgrapht.graph.SimpleWeightedGraph;
import org.junit.*; 

@Test
    public void testEccentricity() {
        WeightedGraph<String, DefaultWeightedEdge> g = generateSimpleCaseGraph();
        Map<String, Double> eccen = JGraphtUtilities.eccentricities(g);

        assertEquals(70, eccen.get("alpha"));
        assertEquals(80, eccen.get("l"));
        assertEquals(130, eccen.get("l-0"));
        assertEquals(100, eccen.get("l-1"));
        assertEquals(90, eccen.get("r"));
        assertEquals(120, eccen.get("r-0"));
        assertEquals(130, eccen.get("r-1"));
    }

त्रुटि संदेश यह है:

इस विधि के प्रकार (ऑब्जेक्ट, ऑब्जेक्ट) प्रकार JGraphtUtilitiesTest के लिए अस्पष्ट है

मैं इसे कैसे ठीक करूं? जब मैंने कक्षा को एक अलग पैकेज में स्थानांतरित किया तो यह समस्या क्यों हुई?


हमें बताएं कि आपकी कक्षा कैसे घोषित हुई। मुझे ऐसा लगता है जैसे आपको JUnit3 से विरासत में मिला है और फिर JUnit4 से सांख्यिकीय रूप से आयात करने का प्रयास किया गया है।
bmgulies

हाँ, वास्तव में, मेरे पास पैकेज A में JUnit3 था, और पैकेज B में JUnit4 का उपयोग किया, जहां मैंने मूल रूप से इन परीक्षणों को लिखा था। तब मैंने पैकेज बी से पैकेज ए पर स्विच किया, और समस्या पैदा हुई। लेकिन मुझे इस वर्ग में कुछ भी दिखाई नहीं दे रहा है जो JUnit 3 को दर्शाता है। यह कहां घोषित किया गया है?
निक हेइनर

@Rosarch क्या ये JGraphtUtilities कहीं भी उपलब्ध है? मैं JGraphT में सनकी पैदा करने के तरीके नहीं देख सकता!
निक

जवाबों:


205

विधि (ऑब्जेक्ट, ऑब्जेक्ट) के प्रकार के लिए अस्पष्ट है ...

इस त्रुटि का मतलब यह है कि आप एक doubleऔर Doubleऐसी विधि से गुजर रहे हैं जिसमें दो अलग-अलग हस्ताक्षर हैं: assertEquals(Object, Object)और assertEquals(double, double)दोनों को ऑटोबॉक्सिंग के लिए धन्यवाद कहा जा सकता है।

अस्पष्टता से बचने के लिए, सुनिश्चित करें कि आप या तो assertEquals(Object, Object)(दो डबल्स पास करके) कॉल करते हैं ( या दो डबल्स assertEquals(double, double)पास करके)।

तो, आपके मामले में, आपको उपयोग करना चाहिए:

assertEquals(Double.valueOf(70), eccen.get("alpha"));

या:

assertEquals(70.0d, eccen.get("alpha").doubleValue());

ठीक है, या मैं इसे JUnit 4 के बजाय JUnit 4 का उपयोग करने के लिए स्विच कर सकता हूं। मैं यह कैसे कर सकता हूं?
निक हेइनर

8
समाधान वास्तव में एक संस्करण से दूसरे में स्विच करने के लिए नहीं है। इसके बजाय, संकलक की मदद करें और जैसा कि मैंने सुझाव दिया है, अस्पष्टता को हटा दें।
पास्कल थिवेंट

1
वैसे भी, यह जोर नहीं होना चाहिए (70.0d, eccen.get ("अल्फा")); ?
mhaller 3

3
@ एम्हरर को यकीन नहीं है कि आप किससे बात कर रहे हैं, भले ही यह ओपी के कोड से अधिक सही हो, यह अभी भी अस्पष्ट है यदि जेयूनीट के संस्करण में दोनों हैं assertEquals(Object, Object)और assertEquals(double, double)जो जेयूनाइट 4.4, 4.5 का मामला है। लेकिन जैसा कि मैंने कहा, जुनीत के संस्करण को बदलना वास्तविक समाधान नहीं है, बस समस्या को ठीक करें।
पास्कल थिवेंट

1
इस विशेष मामले के लिए @Rosarch, यह JUnit 3.8.1 में एक समस्या नहीं है, यह JUnit 4.3 में एक समस्या नहीं है, यह है JUnit 4.4 में एक समस्या है, यह है JUnit 4.5 में एक समस्या (लेकिन विधि 2 लेने युगल को पदावनत किया गया है), यह JUnit 4.6 (विधि को हटा दिया गया है) में कोई समस्या नहीं है। तो, अपनी पसंद बनाएं, लेकिन आपको कोड को ठीक करना चाहिए।
पास्कल थिवेंट

1

आप विधि का उपयोग कर सकते हैं

assertEquals(double expected, double actual, double delta)

जो राउंडिंग एरर को ध्यान में रखेगा जो फ़्लोटिंग पॉइंट के लिए हाइरेंट है ( उदाहरण के लिए इस पोस्ट को देखें)। तुम लिख सकते हो

assertEquals(70, eccen.get("alpha"), 0.0001);

इसका मतलब यह है कि जब तक दोनों मान 0.0001 से कम के लिए भिन्न होते हैं, तब तक उन्हें समान माना जाता है। इसके दो फायदे हैं:

  • फ्लोटिंग पॉइंट वैल्यू की तुलना करें क्योंकि वे माना जाता है
  • कोई आवश्यकता नहीं है, क्योंकि तीन तर्क केवल डबल्स पर लागू होते हैं, न कि सामान्य वस्तुओं पर

0

इस समस्या का सबसे सरल समाधान सिर्फ दूसरे पैरामीटर को एक आदिम में डालना है:

assertEquals(70, (double)eccen.get("alpha"));

अस्पष्टता दूर हुई।

यह किसी भी संख्या उपवर्ग के लिए मान्य है, उदाहरण के लिए:

assertEquals(70, (int)new Integer(70));

एक अस्पष्टता को भी हल करेगा।

हालाँकि, assertEquals (डबल, डबल) अब और अच्छे कारणों से हटा दिया गया है, इसलिए मैं आपको एक डेल्टा के साथ विधि का उपयोग करने के लिए प्रोत्साहित करता हूं जैसा कि दूसरों ने पहले ही सुझाया है।

अच्छे कारणों से मेरा तात्पर्य है कि, दोहरे नंबरों के आंतरिक प्रतिनिधित्व को देखते हुए, दो स्पष्ट रूप से बराबर डबल संख्या एक अप्रासंगिक इन्फिनिटिमल अंश में भिन्न हो सकती हैं और एक परीक्षा पास नहीं करेगी, लेकिन इसका मतलब यह नहीं है कि आपके कोड में कुछ भी गलत है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.