我正在使用junit,mockito和mockMVC来测试Web应用程序的工作。我正在与一种我无法弄清楚的注射的依赖作斗争。我的网络应用程序结构如下。
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,但无法弄清楚如何在我的控制器的模拟 MVC 实例中注入 service 2 的模拟。据我所知,@InjectMocks 在 mockito 中只注入了一层深度的模拟,而不是两级。
编辑:
我正在使用以下内容来获取控制器的模拟MVC实例
MockMvc controller;
controller = MockMvcBuilders.standaloneSetup(Controller);
你本质上想做的是模拟一个豆子。
在您的情况下,您必须使用@MockBean注释来模拟 bean for service2。
有关详细信息,请参阅此文章。
你不需要那个。
嘲笑search service
就足够了,因为你掌握了需要做的事情。
例:
doReturn(...).when(searchService).doSearch(any());
在执行单元测试时,开发人员需要识别被测系统并模拟/存根所有协作者。
因此,在这种情况下,您将为控制器和搜索服务编写单独的单元测试。
另外,请阅读马丁·福勒(Martin Fowler)的这篇精彩文章 - 模拟不是存根。