gpt4 book ai didi

java - 使用 Spring 3.2 和 Mockito 进行 Controller 单元测试的上下文初始化问题

转载 作者:行者123 更新时间:2023-11-29 07:58:41 25 4
gpt4 key购买 nike

我正在尝试为我的 Controller 提供干净的单元测试。这个 Controller 有一个服务作为依赖,这个 Serviceh 有一个数据源作为依赖。

测试看起来像这样:

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration
public class ContentActionWebServiceControllerTest {
@Autowired
private WebApplicationContext wac;

private MockMvc mockMvc;

@Autowired
private MyService myService;

@Test
public void getRequestActionList() throws Exception {
when(...)
perform(...);
verify(...);
}

@Configuration
@ImportResource("...")
static class MyTestConfiguration {

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

MyService 类似于

@Service
public class MyService {
@Autowired
private MyDataSource myDatasource;

...
}

因为 MyService 作为 Autowired 属性 MyDataSource,上下文没有被初始化,因为它没有找到任何 MyDataSource 类型来满足 MyService 的 @Autowired 注释。但是为什么它会尝试解析这个注解呢?这是模拟吗?

最佳答案

Mockito 确实使用 cglib 创建一个新的 MyService 子类(并用模拟方法覆盖所有方法)。

但是,仍然会注入(inject)父级的依赖项,因为这是 Spring 的工作方式:

如果你有一个带有一些@Autowired字段的父类,以及一个从这个父类继承的子类,那么Spring会注入(inject)@Autowired字段实例化 child 时的 parent 。我想这与您的情况相同。

如果您使用MyService 的接口(interface),那么您的问题将得到解决。

关于java - 使用 Spring 3.2 和 Mockito 进行 Controller 单元测试的上下文初始化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15926494/

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