Spring Testing - 使用嵌套的bean依赖项注入mocked bean

时间:2013-07-18 21:19:26

标签: java spring spring-mvc junit mockito

我有一个像这样的Bean结构(但有更多级别):

@Controller
public class MyController {
    @Autowired
    private MyService myService;
}

@Service
public class MyService {
    @Autowired 
    private MyDao myDao;
}

@Repository
public class MyDao {

}

我想用MyControllerMockMvc进行单元测试。如果我创建了一个创建MyController实例的上下文,它需要一个MyService实例进行注入,它需要一个MyDao实例,依此类推。即使我模仿MyService喜欢(没有组件扫描)

@Bean
public MyController myController() {
    MyController controller = new MyController ();
    return controller;
}

@Bean
public MyService myService() {
    return Mockito.mock(MyService.class);
}

Spring会在@Autowired内看到MyDao的{​​{1}},并尝试在上下文中找到一个。它显然会失败并抛出异常。我可以为我的每一个类创建一个包含模拟的上下文,但我宁愿不这样做。

有什么方法可以告诉Spring不要注入bean的字段或者只是简单地注入我需要在我的控制器中使用MyService进行测试的模拟器吗?

2 个答案:

答案 0 :(得分:4)

如果您想对控制器进行单元测试,可以使用独立的mockMvc。

 private MockMvc mockMvc;

 private SomeController controller = new SomeController();
 @Mock 
 private ResourceAdminService resourceAdminService;


 @Before
 public void setup() throws Exception {
    controller.setResourceAdminService(resourceAdminService);
    this.mockMvc = MockMvcBuilders.standaloneSetup(controller).build();
 }

如果您仍想设置ApplicationContext,但它对DI来说太烦人了。也许你会对这篇文章感兴趣(http://java.dzone.com/articles/how-use-mockstub-spring)。但是策略C:动态注入将在每个测试中重建一个ApplicationContext,如果你有太多的@Test方法,这可能会减慢你的测试速度。

答案 1 :(得分:0)

您可以使用spring-reinject覆盖全局模拟的特定bean,请参阅https://github.com/sgri/spring-reinject/wiki/User%27s-Guide