3

我有一个像这样的 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 将看到内部的@Autowiredfor并尝试在上下文中找到一个。它显然会失败并抛出异常。我可以为我的每个班级创建一个模拟的上下文,但我宁愿不这样做。MyDaoMyService

有什么方法可以告诉 Spring 不要注入 bean 的字段,或者以不同的方式简单地在控制器中注入我需要的一个模拟来进行测试MockMvc

4

2 回答 2

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:Dynamic Injecting 会为每个测试重建一个 ApplicationContext,如果你有太多的 @Test 方法,这可能会减慢你的测试速度。

于 2013-07-19T01:51:58.030 回答
0

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

于 2014-02-02T16:02:51.857 回答