gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 21:06:17 25 4
gpt4 key购买 nike

我无法找出为什么以下简单场景失败:我有一个带有过滤器的 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 属性 dataSource,因此在我的 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 的 dataSource 依赖关系未得到满足。既然我用模拟包装了它,为什么它仍然失败?我该如何解决它?

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(或任何其他模拟框架)模拟一个类时,该类仍然是原始类的实例。随之而来的是它还包含所有注释和类信息。

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

要么不使用 Autowiring ,要么不模拟类而是模拟接口(interface)(不包含该信息)。

关于Spring Test + Mockito.mock - Spring 失败,因为它尝试加载模拟 bean @Autowired 依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35844132/

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