我找不到为什么以下简单场景失败:我有一个带有过滤器的 Spring 应用程序,该过滤器从应用程序上下文加载 Spring bean:
public class MyFilter implements Filter{
private IPermissionService permissionService;
public void init(FilterConfig filterConfig) throws ServletException {
WebApplicationContext ac = null;
try{
ac = WebApplicationContextUtils.getRequiredWebApplicationContext(filterConfig.getServletContext());
permissionService = ac.getBean(PermissionServiceImpl.class);
PermissionServiceImpl有一个@Autowired属性数据源,所以在我的TestNG测试中,我在Spring applicationContext中模拟了它:
@Configuration
public class MyFilterSpringTestConfig{
@Bean
public IPermissionService permissionService(){
return Mockito.mock(PermissionServiceImpl.class);
}
我的测试:
@Test
@WebAppConfiguration
@ContextConfiguration(classes=MyFilterSpringTestConfig.class)
public class MyFilterSpringTest extends BaseSpringFilterTest{
...
问题是在 Spring 初始化时,我收到一个异常,抱怨 PermissionServiceImpl 的数据源依赖项不满足。既然我用模拟包了它,为什么它仍然失败?我该如何解决它?
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [javax.sql.DataSource] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=myDataSource)}
当使用 Mockito(或任何其他模拟框架)模拟类时,该类仍然是原始类的实例。随之而来的是,它还包含所有注释和类信息。
因此,当您创建类的模拟时,它仍然会检测其上的所有注释并尝试完全填充该注释。 即 @Autowire
其他实例。
要么不使用自动连线,要么不要模拟类,而是模拟接口(不包含该信息)。