gpt4 book ai didi

java - Spring 单元测试

转载 作者:行者123 更新时间:2023-12-02 03:26:36 24 4
gpt4 key购买 nike

当我作为 Spring Boot 应用程序启动应用程序时,ServiceEndpointConfig 会正确 Autowiring 。但是当我作为 Junit 测试运行时,出现以下异常。我正在使用 application.yml 文件和不同的配置文件。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MyServiceContextConfig.class,
loader = SpringApplicationContextLoader.class)
@ActiveProfiles({"unit", "statsd-none"})
public class MyServiceTest
{
}

@Configuration
public class MyServiceContextConfig {

@Bean
public MyService myServiceImpl(){
return new MyServiceImpl();
}
}

@Configuration
@Component
@EnableConfigurationProperties
@ComponentScan("com.myservice")
@Import({ServiceEndpointConfig.class})
public class MyServiceImpl implements MyService {

@Autowired
ServiceEndpointConfig serviceEndpointConfig;

}

@Configuration
@Component
@ConfigurationProperties(prefix="service")
public class ServiceEndpointConfig
{
}

错误:

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'myServiceImpl': 
Unsatisfied dependency expressed through field 'serviceEndpointConfig': No qualifying bean of type [com.myservice.config.ServiceEndpointConfig] found

最佳答案

您处理 MyServiceImpl 的方式不一致:一方面,您使用扫描注释,另一方面,您显式创建一个 @Bean一个配置类。仅当 Spring 通过扫描选取 MyServiceImpl 时,才会处理导入指令;否则,它不会被视为配置。

你的类(class)关系错综复杂;依赖注入(inject)的全部要点是,MyServiceImpl 应该说明它需要什么类型的东西,而不是自己创建它。这种组织并不比在内部手动创建依赖关系更好。

相反,

  • MyServiceImpl 中删除 @Configuration@Import 指令,
  • MyServiceImpl 上使用构造函数注入(inject),并且
  • 更改您的测试配置以包含所有必要的配置类。

通过构造函数注入(inject),您可以完全绕过 Spring 上下文,只需创建一个 new MyServiceImpl(testServiceConfig),即可将其作为实际的单元测试来运行。

关于java - Spring 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38795290/

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