2 ta ob'ektdagi barcha maydonlar qanday tekshiriladi?

JUnit testini yozyapman va ikkita moslamada barcha maydonlar ni sinab ko'rishni istayman.

Men quyidagilarni sinab ko'rdim:

@Test
    public void testPersonObjectsAreEqual(){

        Person expectedPerson = new Person("100100", "sampleName", "sampleAddress");
        Person actualPersonReturned = repository.getPersonById("100100);

        Assert.assertTrue(EqualsBuilder.reflectionEquals(expectedPerson, actualPersonReturned));
    }

Ammo 2 ob'ektdagi joylar bir xil bo'lsa-da, sinov muvaffaqiyatsiz.

They are both have: 100100 , sampleName and sampleAddress

0
EqualsBuilder # reflectionEquals() ushbu berilgan ob'ektlar ichidagi barcha atributlarga tenglashishga harakat qiladi. Faqat siz ko'rib chiqilishi kerak bo'lgan atributlarga kerakligini aniqlash uchun sampleName va exampleAddress kodlarini topshirishingiz kerak
qo'shib qo'ydi muallif Jude Niroshan, manba
faqat o'zingizning sinfingizning teng usulini bekor qilishingiz va qaerga kelganingizdan so'ng disk raskadrovka qilishingiz mumkin. va 5-satrda typo tuzatish kerak: ("100100"); -> ("100100");
qo'shib qo'ydi muallif Matthias Schmidt, manba

7 javoblar

Eng oddiy/eng ko'p ustun usul - siz taklif qilgan barcha sinflarga (ichki kursdagilardan tashqari) equals() (va hashCode() ) ni bekor qilish va Assert.assertEquals (kutilgan, amaldagi) .

EqualsBuilder.reflectionEquals (Object lhs, Ob'ektni rhs) yordamida sayoz taqqoslashni amalga oshirayotganligi va haqiqiy kodingizda Shaxs equals() ilovasiga ega bo'lmagan manzil misoli.

2
qo'shib qo'ydi
OK, men buni bilmayapman, nima bilan shug'ullanishim mumkin? Ie. Ob'ektimdagi ushbu 3 maydonning har birini tekshirmoqchi bo'lsam?
qo'shib qo'ydi muallif java123999, manba
Bundan tashqari, bu ish ichki tuzilish uchun ishlaydi? Men faqat soddalik uchun 3 ta joyni qo'shdim, lekin ayni paytda ob'ektlar obyekti, ya'ni ob'ektni obyekti ichida joylashgan ob'ekt bormi?
qo'shib qo'ydi muallif java123999, manba
Men sizning ichingizdagi ob'ektga ega ekanligingizdan shubhalanardim va sizning kodingiz siz taqdim qilgan narsalardan farqli o'laroq, chunki taqdim etgan narsalaringiz muvaffaqiyatsiz bo'lishi mumkin emas.
qo'shib qo'ydi muallif Adam Siemion, manba

EqualsBuilder#reflectionEquals() has many variations. Consider to exclude the unwanted attributes. Then you can precisely compare 2 objects.

Siz o'zingizning sinfingizda oddiy equals() bekor qilishini ham ishlatishingiz mumkin.

https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/builder/EqualsBuilder.html# reflectionEquals-java.lang.Object-java.lang.Object-java.lang.String ...-

2
qo'shib qo'ydi

Sizning namunangizda o'zingizning shaxsingizdagi teng huquqlar metodini bekor qilishingiz kerak (agar shaxs obyektining atributlari bir xil bo'lsa, aslida qaytarish). Misol uchun:

public class Person {

    private String name;
    private String surname;

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Person other = (Person) obj;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        if (surname == null) {
            if (other.surname != null)
                return false;
        } else if (!surname.equals(other.surname))
            return false;
        return true;
    }

}

Agar IDE bilan avtomatik ravishda ishlating, avvalgi qism qismi Eclipse bilan avtomatik ravishda yaratilgan.

1
qo'shib qo'ydi
Bu ichki tuzilish uchun ishlaydimi? Men faqat soddalik uchun 3 ta joyni qo'shdim, lekin ayni paytda ob'ektlar obyekti, ya'ni ob'ektni obyekti ichida joylashgan ob'ekt bormi?
qo'shib qo'ydi muallif java123999, manba
Ichki qismdagi sinflarga tenglashtirilgan usulni qo'shganimdan keyin ishlay boshladim
qo'shib qo'ydi muallif java123999, manba
Ha, lekin u holda teng darajadagi usulni 2-darajali sinfda (va 3-chi va hokazo)
qo'shib qo'ydi muallif Boni García, manba

AssertTrue o'rniga assertEquals yordamida test qilishingiz mumkin

@Test
public void testPersonObjectsAreEqual(){

    Person expectedPerson = new Person("100100", "sampleName", "sampleAddress")
    Person actualPersonReturned = repository.getPersonById("100100);

    Assert.assertEquals(expectedPerson, actualPersonReturned);
}
1
qo'shib qo'ydi

"Unitils" nomi bilan ataladigan yaxshi kutubxonadan foydalanishingiz mumkin

User user1 = new User(1, "John", "Doe");
User user2 = new User(1, "John", "Doe");
assertReflectionEquals(user1, user2);

Foydalanish oson va teng va xash usullarini bekor qilishning hojati yo'q. Ushbu tasdiq ikkala ob'ektda ham barcha maydonlarni aylantiradi va ularning qiymatlarini ko'zgu yordamida taqqoslaydi. Yuqoridagi misol uchun, avvalo, id maydoni qiymatlarini, keyingi ikkala maydon qiymatlarini va nihoyat so'nggi joylar qiymatlarini solishtiramiz.

http://www.unitils.org/tutorial-reflectionassert.html

0
qo'shib qo'ydi

Shaxsan, men bu uchun maxsus moslashtiruvchi foydalanardim

@Test
public void testPersonObjectsAreEqual(){

    Person expectedPerson = new Person("100100", "sampleName", "sampleAddress")
    Person actualPersonReturned = repository.getPersonById("100100);

    assertThat(actualPersonReturned, is(matchingPerson(expectedPerson)));
}

private Matcher matchingPerson(Person expected) {
    return new TypeSafeMatcher() {
        public boolean matchesSafely(Person actual) {
            return actual.getId().equals(expected.getId())
                && actual.getName().equals(expected.getName();
                && actual.getAddress().equals(expected.getAddress();
        }

        public void describeMismatchSafely(Person person, Description mismatchDescription) {
            mismatchDescription.appendText("give a meaningful message");
        }
    };

}
0
qo'shib qo'ydi

Ob'ektlarning tengligini aniqlash uchun shaxs klassida tenglashtirilgan hashCode usuli

0
qo'shib qo'ydi