весенняя попытка внедрить зависимости @Autowired в экземпляре Mocked - PullRequest
0 голосов
/ 31 января 2019

У меня есть следующие классы: com.foo.pkgx:

@Component public class A {}

@Component public class B {
    @Autowired A a;
}

com.foo.pkgy:

@Component public class C {
    @Autowired B b;
}

В зависимости от IE: C -> B ->A

При выполнении следующей спецификации спока:

@Configuration
@ComponentScan(basePackages = ["com.foo.pkgy"])
class Config {
    def mockFactory = new DetachedMockFactory()

    @Bean
    B b() {mockFactory.Mock(B)};
}

@ContextConfiguration(classes = Config)
class CSpec extends Specification {

    @Autowired
    C c;

    def "sanity"() {
        expect: c
    }
}

Тест не прошел инициализацию:

Caused by: org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'c': 
Injection of autowired dependencies failed; 
nested exception is org.springframework.beans.factory.BeanCreationException: 
Could not autowire field: com.foo.pkgx.B com.foo.pkgy.C.b; 
nested exception is org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'b': 
Injection of autowired dependencies failed; 
nested exception is org.springframework.beans.factory.BeanCreationException: 
Could not autowire field: com.foo.pkgx.A com.foo.pkgx.B.a; 
nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No qualifying bean of type [com.foo.pkgx.A] 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)}

Я прочитал это как «попытался соединить A с B, ноне удалось".Я не ожидал, что Б подвергнется автоматической разводке, так как она высмеивается.

Может ли кто-нибудь пролить свет?

Спасибо!

1 Ответ

0 голосов
/ 31 января 2019

Макет класса - это подкласс, сгенерированный библиотекой генерации кода, byte-buddy или cglib-nodep.Это обычный боб с точки зрения весны.И как только какой-либо бин создается, то в какой-то момент Spring начинает «самоанализ» бина с помощью различных ...BeanPostProcessors.Например, автопроводка обрабатывается AutowiredAnnotationBeanPostProcessor.Этот постпроцессор работает таким образом, что каждый бин проверяется по всей иерархии классов.Таким образом, ваш class B есть с @Autowired полем A, и Spring пытается разрешить эту зависимость без удачи.

Хорошая новость заключается в том, что существует потребность в такой функции отключенияавтопроводка для каждого компонента.И, похоже, в конце концов, команда Spring представит ее в ближайшее время .

Тем временем вы можете просто высмеивать A, чтобы разрешить зависимость B.Или вы можете просто использовать интерфейсы для своих компонентов, а не просто классы.Я считаю, что последняя является лучшей практикой

...