Как внедрить ссылку на интерфейс в Spring Controller во время тестирования junit с использованием PowerMockito Testing Framework?

У меня есть Spring Controller, в котором один интерфейс автоматически подключается, как показано в следующем классе.

@Controller
public class EmployeeController
{
    @Autowired
    private EmployeeManager employeeManager;

    public int saveEmployee(Employee employee) {
        int empId = employeeManager.saveEmployee(employee);
        return empId;
    }
}

Теперь я создал один тестовый класс Junit следующим образом.

public class EmployeeControllerTest {

    private EmployeeController employeeController ; 
    private EmployeeManager employeeManager ;

    @Before
    public void setUp() throws Exception {
        employeeController = PowerMockito.spy(new EmployeeController());
        employeeManager = PowerMockito.mock(EmployeeManager.class);
    }

    @Test
    public void shouldGetCountOfEmployees()
    { 
        Employee emp = new Employee("Peter");
        int empId = employeeController.saveEmployee(emp);   
        Assert.assertEquals(1, empId);
    }

Теперь, после выполнения тестового класса, я получаю исключение nullPointerException в строке int empId = employeeManager.saveEmployee(employee); внутри метода saveEmployee контроллера.

Я также пробовал аннотацию @Mock, аннотацию @Spy, но не смог выполнить тестовый пример. Поэтому, пожалуйста, помогите внедрить экземпляр employeeManager в контроллер при выполнении тестового примера с помощью PowerMockito.

Спасибо


person Ranjit Soni    schedule 13.09.2019    source источник


Ответы (2)


Вы должны использовать Whitebox.setInternalState для внедрения макета в EmployeeController.

Пример :

Whitebox.setInternalState(EmployeeController, "employeeManager", employeeManager) ;
person Whysy    schedule 13.09.2019

Я не совсем уверен, что это правильно, но у меня есть идея. Вы издеваетесь над классом EmployeeManager, автоматически подключаете его к контроллеру и вызываете для него метод, который генерирует исключение NullPointerException. Это происходит потому, что объект employeeManager внутри EmployeeController является фиктивным объектом, и если вы вызовете метод для фиктивного объекта, он вызовет исключение NullPointerException.

person Noah Anderson    schedule 13.09.2019
comment
NullPointerException происходит от employeeManager, являющегося null. Макет создается, но никогда не внедряется/автоматически подключается в класс контроллера. Тест не использует возможности Spring. - person thokuest; 13.09.2019