Тестовый класс со значением @Qualifier @Autowired - PullRequest
0 голосов
/ 04 июля 2019

Я тестирую класс, который имеет @Qualified @Autowired значение:

// class under test
class C1() {

    @Autowired
    @Qualified("c1")
    DataSource d1;
    ...
}

Источник данных d1, расположенный в файле конфигурации.

Но когда я тестирую тот же класс и яЯ использую отдельный DataSource, который находится в классе конфигурации теста:

// test for class
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = testC1Config.class, loader=AnnotationConfigContextLoader.class)
class testC1() {

    @Autowired
    @Qualified("c1Test")
    DataSource d1Test;
    ...
}

// testC1Config
@Configuration
class testC1Config() {

    @Bean
    @Qualified("c1Test")
    DataSource c1Test() {
    ...
    }
}

Я получаю это исключение:

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [javax.sql.DataSource] 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), @org.springframework.beans.factory.annotation.Qualifier(value=c1)}

говорит, что он видит только компонент DataSource Bean только с квалификатором c1,Попытался использовать @Bean(name=c1Test"), но я получил тот же результат ..

Как заставить его видеть bean-компонент c1Test DataSource в тестовом пакете?

1 Ответ

0 голосов
/ 04 июля 2019

Хорошо, я сделал обходной путь, который работает.

(За кулисами) В моем случае у меня есть 2 источника данных в пакетах test и src, когда я тестирую метод в src, у него есть @Autowired DataSource, и он просит использовать компонент, который квалифицированс c1, но так как у меня не было c1 источника данных в моем testC1Config(), я получил это исключение.

Таким образом, вместо автоматической разметки bean-компонента и использования спецификатора с конкретным именем, я написал autowired setter с квалификатором, содержащим такое же имя в bean-конфигураторе src.

    @Autowired
    @Qualifier("c1")
    public void setDataSource(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

Для моего случая я также создаю 2 jdbcTemplates, таким образом, всякий раз, когда я запускаю тест, Бин вводит нужный мне DataSource и делает что-то для менядо @Test.В этом случае не нужно указывать имена bean-компонентов в конфигурации, но в службах @Qualifier("with_same_name_in_src_and_test").

Не знаю, насколько это хороший подход к этой проблеме, но ... он работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...