当我将应用程序作为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中删除​​@ImportMyServiceImpl指令,
MyServiceImpl上使用构造函数注入,并且
更改测试配置以包括所有必需的配置类。


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

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

10-11 05:19