Ошибка ожидания JUnit при проверке

Я пытаюсь протестировать JUnit с помощью EasyMock. Я сталкиваюсь с ошибкой утверждения в строке установки, в которой аргумент заполняется из другого частного метода. Ниже приведен код и ошибка сбоя JUnit.

Мой класс JUnit:

private EasyMockSupport easyMockSupport = new EasyMockSupport();
private ObjectOne easymockObject= easyMockSupport.createMock(ObjectOne .class);
// creating employeelist
easymockObject.setEmployee(employeelist);

Мои занятия

ObjectOne methodOne(ObjectOne obj, List<Employee> employeeList) {

    obj.setEmployee(getEmployeeList(employeeList));
    return obj;
}

private List<Employee> getEmployeeList(List<Employee> employeeList) {

    Employee emp = null;
    for (Employee employee: employeeList) {
        if ("somename".equalsIgnoreCase(employee.getName())) {
            emp = new Employee();
            emp.setName(employee.getName());
            break;
        }
    }
    return emp;
}

Я получаю ошибку утверждения для строки:

obj.setEmployee(getEmployeeList(employeeList)); 

потому что Employee не переопределяет методы hashCode и equals. Хотя количество сотрудников одинаковое, но объекты разные, его ошибка. Любое предложение, как справиться с этим, не переопределяя методы hashCode и equals в классе Employee.

  java.lang.AssertionError: 
  Unexpected method call ObjectOne.setEmployee([Employee@528c868]):
    ObjectOne.setEmployee([Employee@64c63c79]): expected: 1, actual: 0

person Breakout    schedule 30.05.2016    source источник
comment
Обратите внимание: мой ответ решит вашу проблему; но ваша настоящая проблема в том, что приведенный выше код вообще не имеет особого смысла; это неверно на многих уровнях: нестатический метод, такой как methodOne(), не должен работать с каким-либо другим объектом ObjectOne; поэтому передача/возврат другого ObjectOne сбивает с толку. Затем именование: избегайте использования списка/набора/карты в именах - не указывайте тип коллекции в своих именах - так как это может измениться. Например, просто назовите это **сотрудниками. Затем getEmployeeList() ... вы уверены, что код правильный? Он должен возвращать СПИСОК, но возвращает один объект сотрудника!   -  person GhostCat    schedule 31.05.2016
comment
Наконец: вы действительно хотите, чтобы ваш класс сотрудников реализовал equals и hashCode. Потому что: вы действительно не хотите, чтобы другие классы содержали логику, подобную приведенной выше, где вы делаете getName() и делаете сравнение/решение на основе этого. И конечно: ваши имена действительно вводят в заблуждение. Например, ваш getEmplyList() можно назвать fetchEmployeeWithGivenName(), чтобы было ясно, что речь идет о поиске конкретного сотрудника.   -  person GhostCat    schedule 31.05.2016
comment
Наконец: действительно хорошо, что вы изучаете модульные тесты. Но: найдите людей, которые рецензируют ваш код. Постоянно. Потому что одни только модульные тесты не исправят ваши плохие методы кодирования.   -  person GhostCat    schedule 31.05.2016


Ответы (3)


Вы могли бы также использовать

Capture<List<Employee>> employeeCapture = new Capture<>();
easymockObject.setEmployee(capture(employeeCapture));

В части утверждения используйте

employeeCapture.getValue()

делать утверждения.

person Chris311    schedule 31.05.2016

Когда вы указываете ожидаемое поведение:

easymockObject.setEmployee(employeelist);

вы неявно указываете EasyMock ожидать, что именно этот список сотрудников объекта будет передан этому вызову.

Но очевидно, что ваш производственный код передает какой-то другой список в ObjectOne.

Итак, что вы можете сделать, так это ослабить это состояние, как в

easymockObject.setEmployee(EasyMock.notNull(List.class))

Теперь EasyMock будет принимать любой ненулевой список для передачи.

person GhostCat    schedule 31.05.2016