Я столкнулся с проблемой при тестировании метода (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.
В чем причина появления этой ошибки? Спасибо за Ваше внимание!
@SiddarthSreeni да, то же разрешение.




Для сравнения двух списков вы можете использовать метод списка 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 в Задаче никогда не инициализируется.
Спасибо, сэр!
Пробовали object.equals ()?