Spring 测试 + Mockito.mock - Spring 失败,因为它试图加载模拟 bean @Autowired 依赖项

Spring Test + Mockito.mock - Spring fails because it tries to load the mocked bean @Autowired dependencies

我无法找出以下简单场景失败的原因:我有一个 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(或任何其他模拟框架)模拟 class 时,class 仍然是原始 class 的一个实例。随之而来的是,它还包含所有注释和 class 信息。

因此,当您创建 class 的模拟时,它仍会检测其上的所有注释并尝试完全填充它。 IE。 @Autowire 其他实例。

要么不使用自动连接,要么不模拟 class 但接口(不包含该信息)。