Внедрение глубоких / вложенных зависимостей при тестировании

Я использую junit, mockito и mockMVC для проверки работы веб-приложения. Я борюсь с зависимостью, введение которой я не могу понять. Моя структура веб-приложения выглядит следующим образом.

Class Controller{

    @Autowired Service searchService;

    @RequestMapping("Search")
    public returnType search(@RequestParam("parameter")String parameter){
        searchService.doSearch(parameter);
    }        
}

и класс обслуживания

Class Service{
    @Autowired Service2 service2;

    public returnType doSearch(String parameter){
        //some code
        service2.call(parameter);
    }
}

Мне нужно протестировать метод поиска для этого контроллера, однако service2 в настоящее время не работает, и, следовательно, его вызовы должны быть издевательскими. Я могу издеваться над service2, но не могу понять, как внедрить имитацию service2 в мой экземпляр контроллера mockMVC. Насколько я знаю, @InjectMocks в mockito вводит только mocks на один уровень, а не на два.

РЕДАКТИРОВАТЬ:

Я использую следующее, чтобы получить экземпляр контроллера MockMVC

MockMvc controller;
controller = MockMvcBuilders.standaloneSetup(Controller);

person Sarthak Nigam    schedule 07.03.2016    source источник
comment
Чтобы издеваться над Service2, вам нужен доступ к контексту Spring, который создается во время вашего модульного теста. Есть несколько способов получить доступ к контексту Spring: вы можете выполнить автоматическую привязку контекста приложения, а затем ввести имитируемый объект службы 2 в качестве основного кандидата для автоматического подключения, или лучше всего будет написать его в виде XML-файла spring, если у вас есть такой, который привыкание к созданию тестового весеннего контекста.   -  person Aditya Kumar    schedule 10.03.2016


Ответы (2)


По сути, вы хотите издеваться над bean-компонентом.

В вашем случае вам нужно имитировать bean для service2, используя аннотации @MockBean.

Дополнительные сведения см. В этой статье.

person Manojkumar Khotele    schedule 31.08.2019

Тебе это не нужно.

Насмешки search service будет достаточно, когда вы поймете, что нужно сделать.

Пример:

doReturn(...).when(searchService).doSearch(any());

При выполнении модульного тестирования разработчик должен идентифицировать тестируемую систему и издеваться над всеми соавторами.

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

Также прочтите эту блестящую статью Мартина Фаулера - Моки - это не заглушки.

person Kapil Malhotra    schedule 07.03.2016
comment
но тогда я тоже не смогу протестировать работу поискового класса. Я хочу протестировать все системы, которые могут работать во время теста. - person Sarthak Nigam; 07.03.2016
comment
При выполнении модульного тестирования вы должны издеваться / заглушать всех соавторов. Вам нужно написать отдельный модульный тест для службы поиска, в котором вы будете имитировать Service2. - person Kapil Malhotra; 07.03.2016
comment
Я обошел проблему, напрямую используя searchService в своем тестовом классе, поскольку контроллер просто передавал ему параметры. Однако, если такая инъекция возможна, дайте мне знать. Спасибо - person Sarthak Nigam; 08.03.2016