Настройка полей в контроллере для использования в Spring Tests - PullRequest
0 голосов
/ 06 ноября 2018

Ну, мне пришлось создать экземпляр Controller, чтобы протестировать его. Более того, мне нужно было установить в этом контроллере некоторые поля, которые не являются бобами Spring. Я нашел несколько способов решения:


  • ReflectionTestUtils.setField ()
  • Создание конструктора в контроллере и его автоматическое подключение

Вот так:

@Autowired
public Controller(Player player) {
    this.player = player;
}

вышеописанный метод на самом деле не работает для меня, потому что я не могу выполнить автоматическое подключение, так как Player не является Spring Bean.

  • Создание конструктора в контроллере, а НЕ его автоматическое подключение

Таким образом:

    public Controller() {

    }

    public Controller(Player player) {
        this.player = player;
    }

Кроме того, мне нужно создать конструктор без аргументов. Без этого выдается несколько исключений, например, «Не удалось загрузить ApplicationContext» .


Итак, в конце концов, я решил использовать последний метод, и при тестировании я просто создаю экземпляр контроллера следующим образом:

public class ControllerTest {
    private Player player = new Player();

    private Controller controller = new Controller(player);
}

Что я в основном хочу знать , если я все делаю правильно. И если есть другие способы установить поля (не являющиеся Spring Beans) в Контроллере и использовать этот Контроллер и его поля при тестировании.

1 Ответ

0 голосов
/ 06 ноября 2018

Если вы используете Spring Boot, вы можете использовать @WebMvcTest для настройки ограниченного контекста Spring и @MockBean для создания фиктивных бинов, необходимых вашему контроллеру, как описано в Тестирование веб-слоя пример:

@RunWith(SpringRunner.class)
@WebMvcTest(Controller.class)
public class WebMockTest {

  @MockBean
  private Player player;

...

Вам следует избегать ReflectionTestUtils.setField(), ваш контроллер должен иметь либо конструктор, либо установщик для поля, если это важно для модульного тестирования.

...