لا يمكن العثور على AssertArrayEquals (Object [] O1 ، Object [] O2)

StackOverflow https://stackoverflow.com/questions/1552893

  •  20-09-2019
  •  | 
  •  

سؤال

الإعداد الخاص بي:

  Netbeans 6.7
  Java6
  JUnit 4.5 added as the Test libraries

عندما أحاول المرور في صفيفتين للفصل (يلقي ككائن []) أحصل على الخطأ "لا يمكن العثور على رمز" ولن يتم تجميع حالة الاختبار الخاصة بي.

ليس لدي مشكلة في بيانات التأكيد الأخرى ، وكما قلت إنني أستخدم مكتبات Junit 4.5.

هل لدى أي شخص أدنى فكرة عن كيفية إصلاح هذا ، أو لاحظ هذا السلوك الغريب؟

يمكن لـ NetBeans العثور على إعلان الوظيفة هذا من خلال الإكمال التلقائي ، ولكنه غير قادر على العثور على مكان وجوده في المصادر أو يمكنها الانتقال إلى المصادر.

عينة من الرموز:

CustomObject[] coa = { new CustomObject() ....}
CustomObject[] expected = { new CustomObject() ... } 
assertArrayEquals((Object[])coa, (Object[])expected);
هل كانت مفيدة؟

المحلول

حسنًا ، Assert.AssertArrayequals هي طريقة ثابتة ، كما ترون من الكود الخاص بك الذي يعمل:

 org.junit.Assert.assertArrayEquals(....)

ولكن في الكود الذي كنت تعطيه ، كنت تحاول استخدامه كطريقة مثيل:

 assertArrayEquals((Object[])coa, (Object[])expected);

هذا من شأنه أن يعمل فقط إذا تم استيرادك بشكل ثابت Assert.* أو Assert.assertArrayEquals.

الآن ، إذا كانت تأكيداتك الأخرى تعمل ، يا خمن هل ما زلت مستمدة من TestCase (أي الطريقة "القديمة" لكتابة اختبارات Junit) وأن تأكيداتك تتصل TestCase.assertEquals إلخ.

إذا كنت تستطيع إعطاء قصيرة ولكن مكتمل مثال على اختبار الوحدة حيث يعمل تأكيد واحد ولكن assertArrayEquals لا ، ربما يمكننا معرفة ما يجري.

نصائح أخرى

لا تحتاج إلى تأهيل التأكيد بالكامل أو إلقاء المصفوفات الخاصة بك على المصفوفات الكائنات. ما عليك سوى استيراد الأجزاء المناسبة من Junit وتمريرها في المصفوفات مباشرة. يجب عليك عكس ترتيب المعلمة من مثالك على الرغم من ذلك - ما تتوقعه يأتي أولاً ("المتوقع") ، ما تحصل عليه بالفعل من الاختبار يأتي ثانيًا ("الفعلي"). هذا يعمل بشكل جيد:

import org.junit.*;
import static org.junit.Assert.*;

public class TestJUnitActuallyWorks {

    @Test
    public void myArraysShouldBeIdentical() {

        CustomObject one = new CustomObject();
        CustomObject two = new CustomObject();
        CustomObject three = new CustomObject();

        CustomObject[] expecteds = { one, two, three };
        CustomObject[] actuals = { one, two, three };
        assertArrayEquals(expecteds, actuals);
    }

    private static class CustomObject {}
}

كانت القضية أن المترجم كان يرفض النظر في الفصل الفعلي .. ولكنه سيكون مع مسار abosulte: org.junit.assert.assertarrayequals (....

بالأحرى مزعج قد أضيف.

أحب إجابة Singleshot باستثناء صفائفه تحتوي بالفعل على نفس الكائنات. ماذا لو لم تكن الكائنات هي نفس الكائنات الفعلية (كائنات مختلفة نفس القيم ولكن يجب أن تكون متساوية).

لذلك اعتقدت أنني سأعزز إجابته لإظهار كيفية القيام بذلك.

@Test
public void myArraysShouldBeIdentical() {

    CustomObject one1 = new CustomObject("one");
    CustomObject two1 = new CustomObject("two");
    CustomObject three1 = new CustomObject("three");

    CustomObject one2 = new CustomObject("one");
    CustomObject two2 = new CustomObject("two");
    CustomObject three2 = new CustomObject("three");

    CustomObject[] expecteds = { one1, two1, three1 };
    CustomObject[] actuals = { one2, two2, three2 };
    assertArrayEquals(expecteds, actuals);
}

private static class CustomObject {
    public String value;

    CustomObject(String inValue)
    {
        value = inValue;
    }

    @Override
    public int hashCode() {
        return value.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null)
            return false;
        if (obj == this)
            return true;
        if (!(obj instanceof CustomObject))
            return false;

        CustomObject rhs = (CustomObject) obj;
        return value == rhs.value;
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top