【问题标题】:Spring Testing - Inject mocked bean with nested bean dependenciesSpring 测试 - 注入具有嵌套 bean 依赖项的模拟 bean
【发布时间】:2013-07-18 21:19:25
【问题描述】:

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

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

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

@Repository
public class MyDao {

}

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

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

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

Spring 将在MyService 中看到MyDao@Autowired,并尝试在上下文中找到一个。它显然会失败并抛出异常。我可以为我的每个班级创建一个包含模拟的上下文,但我不想这样做。

有什么方法可以告诉 Spring 不要注入 bean 的字段,或者用另一种方法简单地在我的控制器中注入我需要的一个 mock,以便使用 MockMvc 进行测试?

【问题讨论】:

    标签: java spring spring-mvc junit mockito


    【解决方案1】:

    如果你想对控制器进行单元测试,你可以使用独立的 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 方法,这可能会减慢你的测试速度。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-08-02
        • 1970-01-01
        • 2020-04-14
        • 2019-06-24
        • 1970-01-01
        • 2014-06-28
        • 1970-01-01
        相关资源
        最近更新 更多