জাভা জুনিত: এক্সটি ওয়াইয়ের জন্য X পদ্ধতিটি অস্পষ্ট


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

ত্রুটি বার্তাটি হ'ল:

পদ্ধতি assertEquals (অবজেক্ট, অবজেক্ট) JGraphtUtilitiesTest প্রকারের জন্য অস্পষ্ট

আমি এটা কিভাবে ঠিক করবো? আমি ক্লাসটি অন্য একটি প্যাকেজে সরানোর সাথে সাথে এই সমস্যাটি কেন ঘটল?


আপনার শ্রেণি কীভাবে ঘোষণা করা হয় তা আমাদের বলুন। আমাকে দেখে মনে হচ্ছে আপনি JUnit3 থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়েছেন এবং তারপরে JUnit4 থেকে স্থিতিশীলভাবে আমদানির চেষ্টা করেছেন।
bmargulies

হ্যাঁ, আসলে আমার প্যাকেজ এ-এ JUnit3 ছিল এবং আমি প্যাকেজ বিতে JUnit4 ব্যবহার করেছি, যেখানে আমি প্রাথমিকভাবে এই পরীক্ষাগুলি লিখেছিলাম। তারপরে আমি প্যাকেজ বি থেকে প্যাকেজ এতে স্যুইচ করেছি, এবং সমস্যাটি দেখা দিয়েছে। তবে আমি এই শ্রেণিতে এমন কোনও কিছুই দেখছি না যা জুনিট 3 নির্দেশ করবে that এটি কোথায় ঘোষণা করা হয়েছে?
নিক হেইনার

@ রোসার্চ এই জেগ্রাফটিলিটিগুলি কোথাও পাওয়া যায়? আমি জেগ্রাফ্টে উদ্দীপনা তৈরির পদ্ধতিগুলি দেখতে পাচ্ছি না!
নিক

উত্তর:


205

পদ্ধতি assertEquals (অবজেক্ট, অবজেক্ট) টাইপটির জন্য অস্পষ্ট ...

এই ত্রুটির অর্থ কী তা হল আপনি একটি doubleএবং Doubleএকটি দুটি পদ্ধতিতে যাচ্ছেন যা দুটি স্বাক্ষরযুক্ত: assertEquals(Object, Object)এবং assertEquals(double, double)উভয়ই বলা যেতে পারে, অটোবক্সিংয়ের জন্য ধন্যবাদ।

অস্পষ্টতা এড়াতে, নিশ্চিত হয়ে নিন যে আপনি হয় assertEquals(Object, Object)(দুটি ডাবল পেরিয়ে) অথবা assertEquals(double, double)( দু'বার দ্বিগুণ হয়ে) call

সুতরাং, আপনার ক্ষেত্রে, আপনার ব্যবহার করা উচিত:

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

বা:

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

ঠিক আছে, বা আমি JUnit 4 পরিবর্তে JUnit 4 ব্যবহার করার জন্য এটি স্যুইচ করতে পারি I আমি কীভাবে এটি করব?
নিক হেইনার

8
সমাধানটি আসলে একটি সংস্করণ থেকে অন্য সংস্করণে স্যুইচ করা নয়। পরিবর্তে, সংকলকটিকে সহায়তা করুন এবং আমার পরামর্শ মতো অস্পষ্টতা দূর করুন।
পাস্কেল থিভেন্ট

4
যাইহোক, এটি assertEquals (70.0d, eccen.get ("আলফা")) হওয়া উচিত নয়; ?
মহল্লার

4
@ মহল্লার আপনি কার সাথে কথা বলছেন তা নিশ্চিত নন তবে, যদিও এটি অপির কোডের চেয়ে বেশি সঠিক, তবে এটি এখনও অস্পষ্ট যদি জুনিত সংস্করণে উভয় থাকে assertEquals(Object, Object)এবং assertEquals(double, double)যা ইউনিত ৪.৪, ৪.৪ এর ক্ষেত্রে হয়। তবে আমি যেমন বলেছি, জুনিয়নের সংস্করণ পরিবর্তন করা আসল সমাধান নয়, কেবল সমস্যাটি সমাধান করুন।
পাস্কেল থিভেন্ট

4
এই বিশেষ ক্ষেত্রে জন্য @Rosarch, এটা JUnit 3.8.1 একটি সমস্যা নয়, এটা JUnit 4.3 একটি সমস্যা নয়, এটা হল JUnit 4.4 একটি সমস্যা, এটা হয় JUnit 4.5 একটি সমস্যা (কিন্তু পদ্ধতি 2 গ্রহণ ডাবলগুলি হ্রাস করা হয়), এটি ইউনাইট ৪.6-এ কোনও সমস্যা নয় (পদ্ধতিটি সরানো হয়েছে)। সুতরাং, আপনার পছন্দটি করুন, তবে আপনার কোডটি ঠিক করা উচিত।
পাস্কেল থিভেন্ট

1

আপনি পদ্ধতিটি ব্যবহার করতে পারেন

assertEquals(double expected, double actual, double delta)

যা ভাসমান পয়েন্টের প্রতিবন্ধী এমন গোলাকার ত্রুটি অ্যাকাউন্টে নেবে ( উদাহরণস্বরূপ এই পোস্টটি দেখুন )। তুমি লিখতে পারো

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

এর অর্থ এই যে যতক্ষণ উভয় মানের মান 0.0001 এর চেয়ে কম হয় তাদের সমান হিসাবে বিবেচনা করা হবে। এর দুটি সুবিধা রয়েছে:

  • ভাসমান পয়েন্টের মানগুলি যেমন মনে করা হয় তার সাথে তুলনা করে
  • Castালাই করার দরকার নেই, যেহেতু তিনটি যুক্তি দাবি করে যে ডাবলসের ক্ষেত্রে কেবল প্রযোজ্য, জেনেরিক অবজেক্টের ক্ষেত্রে নয়

0

এই সমস্যার সহজ সমাধানটি কেবলমাত্র দ্বিতীয় পরামিতিটিকে একটি প্রাথমিকের মধ্যে ফেলে দেওয়া হয়েছে:

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

অস্পষ্টতা সরানো হয়েছে।

এটি কোনও নম্বর সাবক্লাসের জন্য বৈধ, উদাহরণস্বরূপ:

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

একটি অস্পষ্টতাও সমাধান করবে।

যাইহোক, assertEquals (ডাবল, ডাবল) আপাতত এবং ভাল কারণে অবহিত করা হয়েছে, তাই অন্যরা ইতিমধ্যে প্রস্তাবিত হিসাবে আমি আপনাকে ব-দ্বীপের সাথে পদ্ধতিটি ব্যবহার করতে উত্সাহিত করি।

ভাল কারণে আমি বলতে চাইছি যে দ্বিগুণ সংখ্যার অভ্যন্তরীণ প্রতিনিধিত্বের কারণে দুটি আপাতদৃষ্টিতে সমান দ্বিগুণ একটি অপ্রাসঙ্গিক অসীম ভগ্নাংশে পৃথক হতে পারে এবং একটি পরীক্ষাও পাস করতে পারে না, তবে এর অর্থ এই নয় যে আপনার কোডে কিছু ভুল আছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.