我正在尝试为我的 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/