Список, содержащий ошибку теста Java

Я столкнулся с проблемой при тестировании метода (displayEmployees), который возвращает Список объектов.

public class Task {
    static List<Employee> employeeList;

    public static void main(String[] args) {
        Employee employee1 = new Employee("Dobrobaba", "Irina", "Ivanovna",
                "Moskva", 1900, 6);
        Employee employee2 = new Employee("Shmal", "Anna", "Nikolaevna",
                "Krasnodar", 2017, 8);
        Employee employee3 = new Employee("Kerimova", "Niseimhalum", "Magomedmirzaevna",
                "New-York", 2017, 3);
        Employee employee4 = new Employee("Dobryden", "Yuri", "Viktorovich",
                "Auckland", 2014, 11);
        Employee employee5 = new Employee("Lopata", "Leonid", "Nikolaevich",
                "Beijing", 2014, 11);
        employeeList = new ArrayList<>(Arrays.asList(employee1, employee2, employee3, employee4, employee5));
    }

    /**
     * Prints employees' information, which have worked more than 'n' year(s) for now.
     *
     * @param n years quantity
     */
    public static List<Object> displayEmployees(int n) {
        List<Employee> requiredList = new ArrayList<>();
            employeeList.forEach(employee -> {
                if (Year.now().getValue() - employee.getEmploymentYear() >= n) {
                    requiredList.add(employee);
                }
            });
        return Collections.singletonList(requiredList);
    }
}

Вот как я пытаюсь сделать тест, сравнивая 2 Списки один с другим:

public class TaskTest {
    public static void main(String[] args) {
        displayEmployeesTest();
    }

    public static void assertEquals(String testName, List<Object> expected, List<Object> actual) {
        if (expected.equals(actual)) {
            System.out.println(testName + " passed");
        } else {
            System.out.println(testName + " failed: expected " + expected + ", actual " + actual);
        }
    }

    private static void displayEmployeesTest() {
        List<Object> expectedList;
        Employee employee1 = new Employee("Dobrobaba", "Irina", "Ivanovna",
                "Moskva", 1900, 6);
        Employee employee2 = new Employee("Shmal", "Anna", "Nikolaevna",
                "Krasnodar", 2017, 8);
        Employee employee3 = new Employee("Kerimova", "Niseimhalum", "Magomedmirzaevna",
                "New-York", 2017, 3);
        Employee employee4 = new Employee("Dobryden", "Yuri", "Viktorovich",
                "Auckland", 2014, 11);
        Employee employee5 = new Employee("Lopata", "Leonid", "Nikolaevich",
                "Beijing", 2014, 11);
        expectedList = new ArrayList<>(Arrays.asList(employee1, employee4, employee5));

        assertEquals("displayEmployeesTest", expectedList, displayEmployees(3));
    }
}

Проблема в том, что я получаю ошибку "java.lang.NullPointerException", выполняю TaskTest.

В чем причина появления этой ошибки? Спасибо за Ваше внимание!

Пробовали object.equals ()?

papaya 19.08.2018 15:44

@SiddarthSreeni да, то же разрешение.

artshakhov 19.08.2018 15:49
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
95
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Для сравнения двух списков вы можете использовать метод списка equals. Однако для использования этого метода класс содержимого списка должен переопределить equals.

employeeList1.equals(employeeList2)

И ваш класс Employee должен переопределять такие равенства:

public class Employee {
    private String name;
    private int id;
    ...

    //getters and setters

    ...

    public boolean equals(Object obj) {
        if (obj == null) return false;
        if (obj instanceof Employee) {
            Employee e = (Employee) obj;
            return this.name.equals(e.name) && this.id == e.id;
        } else return false;
    }
}

Рекомендуется реализовать equals с помощью IDE, например eclipse или Intellij.

Вы получаете нулевой указатель, потому что static List<Employee> employeeList инициализируется в вашем основном методе, который никогда не вызывается вашим тестом.

Чтобы создавать красивые и аккуратные тесты, вам следует использовать Junit. Проверьте это: http://www.vogella.com/tutorials/JUnit/article.html

Надеюсь это поможет

если вы сравниваете созданный вами объект, вы можете позволить классу реализовать сопоставимый интерфейс. у которого есть только один метод - compareTo, который переопределяет метод сравнения сотрудников на основе заданного свойства. использование предопределенного compareTo может не соответствовать тому, как вы хотите сравнивать сотрудников

Ответ принят как подходящий

Вы вызываете Task.displayEmployees, никогда не вызывая Task.main, поэтому поле employeeList в Задаче никогда не инициализируется.

Спасибо, сэр!

artshakhov 19.08.2018 16:18

Другие вопросы по теме