java - جافا: هل assertEquals(سلسلة ، سلسلة) موثوقة؟




string junit (5)

"يتحقق عامل التشغيل == لمعرفة ما إذا كان Objects هما نفس Object بالضبط."

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

String هو Object في java ، لذا يقع في فئة قواعد المقارنة.

وأنا أعلم أن == لديه بعض القضايا عند مقارنة اثنين من Strings . يبدو أن String.equals() هو أسلوب أفضل. حسنا ، أنا أفعل اختبار JUnit وميل بلدي هو استخدام assertEquals(str1, str2) . هل هذه طريقة موثوقة لتأكيد سلسلتين تحتويان على نفس المحتوى؟ وأود أن استخدام assertTrue(str1.equals(str2)) ، ولكن بعد ذلك لا تحصل على فائدة من رؤية ما هي القيم المتوقعة والفعلية على الفشل.

في ملاحظة ذات صلة ، هل لدى أي شخص رابط إلى صفحة أو مؤشر ترابط يشرح بوضوح المشاكل مع str1 == str2 ؟


باختصار - يمكنك الحصول على كائنين String يحتويان على نفس الأحرف ولكنهما كائنات مختلفة (في مواقع ذاكرة مختلفة). يقوم عامل التشغيل == بالتأكد من أن هناك مرجعين يشيران إلى نفس الكائن (موقع الذاكرة) ، لكن الطريقة equals () تتحقق مما إذا كانت الأحرف متماثلة.

عادةً ما تكون مهتمًا بالتحقق مما إذا كانت السلاسل الثلاث تحتوي على نفس الأحرف ، وليس ما إذا كانت تشير إلى نفس موقع الذاكرة.


يجب عليك دائماً استخدام .equals() عند مقارنة Strings في Java.

JUnit يستدعي الأسلوب .equals() لتحديد المساواة في الأسلوب assertEquals(Object o1, Object o2) .

لذا ، فأنت بالتأكيد آمن باستخدام assertEquals(string1, string2) . (لأن String s هي Object s)

هنا رابط لسؤال عظيم بخصوص بعض الاختلافات بين == و .equals() .


assertEquals(obj1, obj2) JUnit assertEquals(obj1, obj2) بالفعل استدعاء obj1.equals(obj2) .

هناك أيضا assertSame(obj1, obj2) الذي يفعل obj1 == obj2 (أي ، يتحقق من أن obj1 و obj2 تشير إلى نفس المثيل) ، وهو ما تحاول تجنبه.

إذن أنت بخير


public class StringEqualityTest extends TestCase {
    public void testEquality() throws Exception {
        String a = "abcde";
        String b = new String(a);
        assertTrue(a.equals(b));
        assertFalse(a == b);
        assertEquals(a, b);
    }
}






junit4