Junit - AssertArrayEquals не работает для определенного пользователем объекта (тип данных Non-Primitive) - PullRequest
1 голос
/ 13 июня 2019

assertArrayEquals не работает для определенного пользователем класса.

У меня есть User класс, который имеет только свойство name.Когда я создаю объекты массива (фактические и ожидаемые) для класса User и пытаюсь выполнить тестирование с assertArrayEquals, проверка не выполняется.

Я получаю ошибку ниже

arrays first differed at element [0]; expected:<cts.Learning.User@3fa77460> but was:<cts.Learning.User@619a5dff>"

Я использую Junit - 4.12 и версию Hamcrest-all 1.3.

public class User {
    private String name;
    public User(){} 
    public User(String name) {
        this.name = name;       
    }   
    public String getName(){
        return name;
    }   
    public void setName(String name) {
        this.name = name;
    }
}

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

public class UserJunit {

    @Test
    public void testUserBO() {          
        User[] expected = new User[2];      
        expected[0] = new User("A");
        expected[1] = new User("B");

        User[] actual = new User[2];
        actual[0] = new User("A");
        actual[1] = new User("B");  
        assertArrayEquals(actual, expected);
    }
}

1 Ответ

1 голос
/ 14 июня 2019

Метод assertArrayEquals - после обработки итерации и ряда других функций - в конечном итоге разрешается следующим вызовом:

expected.equals(actual)

Итак, он вызывает equals в вашем классе User, и так как вы этого не сделалиобъявил метод equals, который делегирует реализации по умолчанию equals в классе Object, который сравнивает с помощью оператора равенства, т.е. сравнивает ссылки на объекты, а не их значение.

Итак, вызов assertArrayEquals завершается вызовом:

actual[0] == expected[0]

И так как они не являются одним и тем же экземпляром, утверждение не выполняется.

Если вы хотите утверждать равенствомежду этими экземплярами User тогда вам нужно будет дать некоторое определение того, что означает, что два экземпляра User равны, т.е. определить метод equals для User.

Вотпример:

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return Objects.equals(name, user.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name);
    }

Если вы добавите вышеупомянутое в ваш класс User, тогда ваш тест пройдет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...