জাভা এর assertEquals পদ্ধতি নির্ভরযোগ্য?


199

আমি জানি যে ==দুটি বিষয় তুলনা করার সময় কিছু সমস্যা আছে Strings। মনে হয় এটি String.equals()একটি আরও ভাল পদ্ধতির। আচ্ছা, আমি JUnit পরীক্ষামূলক করছি এবং আমার অনুরক্তি ব্যবহার করা assertEquals(str1, str2)। দুটি স্ট্রিংয়ে একই বিষয়বস্তু রয়েছে তা জোর দিয়ে দেওয়ার কি এটি নির্ভরযোগ্য উপায়? আমি ব্যবহার করব assertTrue(str1.equals(str2)), তবে তারপরে আপনি প্রত্যাশিত এবং আসল মানগুলি ব্যর্থতার সাথে কী তা দেখার সুবিধা পাবেন না।

সম্পর্কিত নোটে, কারও কি কোনও পৃষ্ঠা বা থ্রেডের লিঙ্ক রয়েছে যা স্পষ্টভাবে সমস্যাগুলি ব্যাখ্যা করে str1 == str2?


1
আপনি যদি অনিশ্চিত হন তবে আপনি কোডটি বা জাভাদোকটি পড়তে পারেন। বিটিডাব্লু আপনি যদি পরীক্ষা করতে চান তবে তারা একই জিনিস আপনি অ্যাসেটসেম ব্যবহার করতে পারেন।
পিটার লরি

2
যদি str1 এবং str2 নাল হয়, assertEquals () সত্য, তবে assertTrue (str1.equals (str2)) একটি ব্যতিক্রম ছুঁড়ে। প্রথম উদাহরণটি একটি কার্যকর ত্রুটি বার্তা মুদ্রণ করবে যেমন str1 এবং str2 এর বিষয়বস্তু, দ্বিতীয়টি নয়।
পিটার লরে

উত্তর:


274

জাভাতে তুলনা করার সময় আপনার সর্বদা ব্যবহার করা উচিত ।.equals()Strings

JUnit .equals()পদ্ধতিতে সাম্য নির্ধারণের জন্য কল করে assertEquals(Object o1, Object o2)

সুতরাং, আপনি অবশ্যই ব্যবহার নিরাপদ assertEquals(string1, string2)। (কারণ Stringগুলি Objectগুলি)

এখানে একটি বড় Stackoverflow প্রশ্ন একটি লিঙ্ক মধ্যে পার্থক্য কিছু সংক্রান্ত ==এবং .equals()


12
উভয় স্ট্রিং শূন্য থাকলে IIRC assertEquals () সফল হয়। এটি যদি আপনি না চান তবে assertNotNull () কেও কল করুন।
ফিনউইউ

10
অতিরিক্ত হিসাবে, আপনি যদি == এর জন্য পরীক্ষা করতে চান, আপনি assertSame ()
জেমস

7
আমি সবসময় বলব না ; কখনও কখনও রেফারেন্স সাম্যতা স্ট্রিংয়ের জন্যও পছন্দসই হয়।
করু

30

assertEqualsequalsতুলনার জন্য পদ্ধতি ব্যবহার করে । অপরেটরটি assertSameব্যবহার করে একটি পৃথক দাবী রয়েছে ==

==স্ট্রিংগুলির সাথে কেন ব্যবহার করা উচিত নয় তা বোঝার জন্য আপনাকে বুঝতে হবে যে ==এটি কী করে: এটি একটি পরিচয় চেক করে। অর্থাত, একই বস্তুটিa == b দেখতে aএবং তা bউল্লেখ করার জন্য চেক করে । এটি ভাষায় অন্তর্নির্মিত এবং এর আচরণ বিভিন্ন শ্রেণি দ্বারা পরিবর্তন করা যায় না। পদ্ধতি, অপরপক্ষে, ক্লাস দ্বারা ওভাররাইড করা যেতে পারে। যদিও এর ডিফল্ট আচরণ ( শ্রেণিতে) অপারেটরটি ব্যবহার করে একটি পরিচয় চেক করতে হয়, তার পরিবর্তে "সমতা" পরীক্ষা করার জন্য অনেকগুলি ক্লাস এটিকে ওভাররাইড করে। এর ক্ষেত্রে , পরীক্ষা করার পরিবর্তে এবং একই বস্তুর উল্লেখ করুন,equalsObject==StringStringaba.equals(b) তারা যে বস্তুগুলিকে উল্লেখ করেছে তা হ'ল উভয় স্ট্রিং যা ঠিক একই অক্ষর ধারণ করে কিনা তা পরীক্ষা করে দেখুন।

সাদৃশ্য সময়: কল্পনা করুন যে প্রতিটি Stringবস্তু একটি কাগজের টুকরো যা কিছু লেখা আছে। ধরা যাক, আমার কাছে দুটি ফুটে লেখা কাগজ রয়েছে যার উপরে "ফু" লেখা আছে এবং অন্যটিতে "বার" লেখা আছে। আমি যদি প্রথম দুটি টুকরো কাগজ নিয়ে থাকি এবং ==তাদের তুলনা করতে ব্যবহার করি তবে এটি ফিরে আসবে falseকারণ এটি মূলত জিজ্ঞাসা করছে "এগুলি কি একই কাগজের টুকরো?" এমনকি কাগজে কী লেখা আছে তাও দেখার দরকার নেই। আমি এটিকে দুটি টুকরো কাগজ দিচ্ছি (বরং একবারে দু'বারের তুলনায়) এর অর্থ এটি ফিরে আসবে false। তবে আমি যদি ব্যবহার করি equalsতবে equalsপদ্ধতিটি দুটি টুকরো কাগজ পড়বে এবং দেখবে যে তারা একই জিনিস ("ফু") বলে, এবং তাই এটি ফিরে আসবে true

স্ট্রিংগুলির সাথে বিভ্রান্ত হয়ে ওঠার বিভাটিটি হ'ল জাভাটির "ইন্টার্নিং" স্ট্রিংসের ধারণা রয়েছে এবং এটি (কার্যকরভাবে) আপনার কোডের যে কোনও স্ট্রিং লিটারেলগুলিতে স্বয়ংক্রিয়ভাবে সম্পাদিত হয়। এর অর্থ হ'ল যদি আপনার কোডে দুটি সমতুল্য স্ট্রিং লিটারেল থাকে (যদিও তারা বিভিন্ন শ্রেণিতে থাকে) তারা উভয়ই একই Stringবস্তুকে বোঝায় । এটি ==অপারেটরটিকে trueপ্রত্যাশার চেয়ে আরও বেশি বার করে তোলে ।


"এটি, a == b পরীক্ষা করে দেখুন যে a এবং b একই অবজেক্ট কিনা" " প্রযুক্তিগতভাবে এটি পরীক্ষা করে যে a এবং b একই বস্তুর রেফার করে, যেহেতু a এবং b উল্লেখ রয়েছে। আমি খুব ভুল না হলে।
বব

@ user1903064 এটি সঠিক। যেহেতু অ-আদিম ভেরিয়েবলগুলি কেবল জাভাতে রেফারেন্স ধারণ করতে পারে, তাই সেগুলি সম্পর্কে কথা বলার সময় অতিরিক্ত স্তরের ইন্ডিয়ারেশান এড়িয়ে চলা সাধারণ বিষয়, তবে আমি একমত যে এই ক্ষেত্রে আরও স্পষ্ট হওয়া উপকারী। আমি উত্তর আপডেট করেছি। পরামর্শের জন্য ধন্যবাদ!
লরেন্স গনসাল্ভেস

7

সংক্ষেপে - আপনার কাছে দুটি স্ট্রিং অবজেক্ট থাকতে পারে যা একই অক্ষরগুলি ধারণ করে তবে বিভিন্ন বস্তু (বিভিন্ন মেমরি অবস্থানের)। অপারেটরটি যাচাই করে দেখুন যে দুটি রেফারেন্স একই বস্তু (মেমরি অবস্থান) এর দিকে নির্দেশ করছে, তবে সমান () পদ্ধতিটি যদি অক্ষর একই হয় তবে তা পরীক্ষা করে।

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



3

হ্যাঁ, এটি পরীক্ষার জন্য সর্বদা ব্যবহৃত হয়। এটি খুব সম্ভবত যে পরীক্ষার কাঠামো এইগুলির সাথে তুলনা করার জন্য .equals () ব্যবহার করে।

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

http://blog.enrii.com/2006/03/15/java-string-equality-common-mistake/


3

JUnit assertEquals(obj1, obj2)প্রকৃতপক্ষে কল করে না obj1.equals(obj2)

এমনও রয়েছে assertSame(obj1, obj2)যা obj1 == obj2(যেমন, এটি যাচাই করে obj1এবং একই উদাহরণটি obj2উল্লেখ করে ), যা আপনি এড়াতে চাইছেন।

সুতরাং আপনি ভাল আছেন।


0

" ==অপারেটর দুটি Objectsঠিক একই রকম কিনা তা পরীক্ষা করে দেখুন Object" "

http://leepoint.net/notes-java/data/strings/12stringcomparison.html

StringObjectজাভাতে এটি একটি , সুতরাং এটি তুলনামূলক বিধিগুলির মধ্যে falls


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