当我将应用程序作为Spring Boot应用程序启动时,ServiceEndpointConfig会正确地自动接线。但是当我作为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
时,才会处理import指令。否则,它不会被视为配置。
您之间的关系纠缠不清;依赖项注入的全部要点是MyServiceImpl
应该说出它需要什么样的东西,而不是自己创建。这种组织没有比在内部手动创建依赖关系更好。
代替,
从@Configuration
中删除@Import
和MyServiceImpl
指令,
在MyServiceImpl
上使用构造函数注入,并且
更改测试配置以包括所有必需的配置类。
使用构造函数注入,您可以完全绕过Spring上下文,只需创建new MyServiceImpl(testServiceConfig)
即可将其作为实际的单元测试运行。
关于java - Spring 单元测试,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38795290/