gpt4 book ai didi

java - Spring 测试 - 注入(inject)具有嵌套 bean 依赖项的模拟 bean

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:17:24 27 4
gpt4 key购买 nike

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

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

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

@Repository
public class MyDao {

}

我想用 MockMvcMyController 进行单元测试。如果我创建一个创建 MyController 实例的上下文,它需要一个用于注入(inject)的 MyService 实例,它需要一个 MyDao 实例,等等。即使我模拟 MyService 就像(没有组件扫描)

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

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

Spring 将在 MyService 中看到 @Autowired for MyDao 并尝试在上下文中找到一个。它显然会失败并抛出异常。我可以为我的每个类(class)创建一个具有模拟的上下文,但我宁愿不这样做。

有什么方法可以告诉 Spring 不要注入(inject) bean 的字段,或者用一种不同的方式简单地注入(inject)我需要在我的 Controller 中使用 MockMvc 进行测试的模拟?

最佳答案

如果你想对 Controller 进行单元测试,你可以使用独立的 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:动态注入(inject)将为每个测试重建一个 ApplicationContext,如果你有太多的 @Test 方法,这可能会减慢你的测试。

关于java - Spring 测试 - 注入(inject)具有嵌套 bean 依赖项的模拟 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17734088/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com