Как я могу протестировать приведение статического класса с помощью Mockito и JUnit?

#java #junit #mockito #powermock

#java #junit #mockito #powermock

Вопрос:

Я тестирую метод, который возвращает приведенный тип объекта, но прямо сейчас я получаю java.lang.ClassCastException.

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

В моей реализации класс Employee расширяется из класса User.

Метод для тестирования в классе EmployeeDelegate:

     public Employee getEmployeeByUsername(String username){
        User user = userService.getUser(username);      
        return (Employee) user;
    }
  

Модульный тест:

     @Test
    public void testGetEmployeeByUsername() {
       User user = new User();      
       String username = "johnDoe";             
       Mockito.when(userDelegate.getUser(any(String.class))).thenReturn(user);    
       Employee response = employeeDelegate.getEmployeeByUsername(username);    
    }
  

Я также пытался сделать

 User user = Mockito.mock(User.class)
  

Но все равно не работает

Я ожидаю, что статическое приведение работает правильно.

Комментарии:

1. .thenReturn(user); user будучи User , а затем вы явно приводите к FrontOfficeEmployee , как это должно когда-либо работать, как в тесте, так и в производственном коде.

2. Почему у вас есть a, userService который возвращает User s , метод, который утверждает, что возвращает Employee , а на самом деле возвращает FrontOfficeEmployee ?

3. Я внес обновление в свой вопрос, на самом деле метод должен возвращать пользователя (Employee), а не пользователя (FrontOfficeEmployee).

Ответ №1:

FrontOfficeEmployee Это User , но User не обязательно FrontOfficeEmployee .

Ваш делегат должен вернуть новый экземпляр FrontOfficeEmployee вместо нового User .

Ответ №2:

Я исправляю это, делая следующее:

Я изменяю реализацию метода следующим образом:

 public Employee getEmployeeByUsername(String username){
    return (Employee) userService.getUser(username);                
}
  

Затем модульный тестовый пример работает следующим образом:

 @Test
public void testGetEmployeeByUsername(){           
    String username = "daegalle";               
    Employee user = Mockito.mock(Employee.class);
    Mockito.when((Employee) userService.getUser(username)).thenReturn(user);    

    Employee response = employeeDelegate.getEmployeeByUsername(username);  

    Assert.assertEquals(user, response);
}