2016-03-07 2 views
1

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

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 на один уровень в глубину, а не два.

EDIT:

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

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

Чтобы издеваться над Service2, вам нужно иметь доступ к контексту весны, который создается во время тестирования устройства. Существует несколько способов получить доступ к контексту весны, вы можете автосогласовать контекст приложения, а затем ввести издеваемый объект службы 2 в качестве основного кандидата для автопомощи, или лучший способ - записать его в xml, если у вас есть тот, который используется для создания тестового весеннего контекста. –

ответ

0

Вам не нужно это.

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

Пример:

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

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

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

Также читайте this блестящая статья Мартина Фаулера - Mocks Aren't Stubs.

+0

, но тогда я не смогу проверить работу класса поиска. Я хочу протестировать все системы, которые могут жить в ходе теста. –

+0

Выполняя Unit Testing, вы должны высмеять/закрыть всех сотрудников. Вам нужно написать отдельный модульный тест для Search Service, в котором вы будете издеваться над Service2. –

+0

Я обошел проблему, просто используя searchService в своем тестовом классе, поскольку контроллер просто передавал ему параметры. Однако, если такая инъекция возможна, сообщите мне. благодаря –

Смежные вопросы