【发布时间】:2016-03-07 07:47:41
【问题描述】:
我正在使用 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,但无法弄清楚如何在控制器的 mockMVC 实例中注入 service2 的模拟。据我所知,mockito 中的@InjectMocks 只注入一层深的模拟,而不是两层。
编辑:
我正在使用以下获取控制器的 MockMVC 实例
MockMvc controller;
controller = MockMvcBuilders.standaloneSetup(Controller);
【问题讨论】:
-
为了模拟 Service2 ,您需要访问在单元测试期间创建的 spring 上下文。您可以通过多种方式访问 spring 上下文,您可以自动装配应用程序上下文,然后注入 Service 2 的模拟对象作为自动装配的主要候选对象,或者最好的方法是将其编写为 spring 的 xml,如果你有一个是用于创建测试弹簧上下文。