2016-08-05 6 views
0

Когда я запускаю приложение в качестве приложения 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 

ответ

2

Вы обработки MyServiceImpl непоследовательно: С одной стороны, вы используете сканирование аннотаций, а с другой стороны, вы явно создавая @Bean в конфигурации класс. Директива import обрабатывается только тогда, когда Spring выбирает MyServiceImpl через сканирование; в противном случае он не рассматривается как конфигурация.

Ваши отношения между классами запутаны; вся точка инъекции зависимостей заключается в том, что MyServiceImpl должен сказать , что это за предмет, он нуждается, но не создает его сам. Эта организация не лучше, чем вручную создавать зависимости внутри.

Вместо

  • устранить директивы @Configuration и @Import от MyServiceImpl,
  • использовать инъекции конструктора на MyServiceImpl и
  • изменения вашей тестовой конфигурации включить все необходимые конфигурационные классы.

С инъекцией конструкторы, вы можете быть в состоянии обойти контекст Spring целиком и запустить это как фактический блока тест, просто создавая new MyServiceImpl(testServiceConfig).

Смежные вопросы