Весна не впрыскивает тестовый боб - PullRequest
0 голосов
/ 12 июня 2019

В тесте SpringBoot DataSourceHandler создается в AppTestCfg , но DataSource создается в AppCfg . Почему они оба не созданы в AppTestCfg ?

@Configuration
@EnableIntegration
public class AppCfg {
    @Bean
    public DataSourceHandler getDataSourceHandler(DataSource dataSource) {
        return new DataSourceHandler(dataSource);
    }
    @Bean
    public DataSource getSource(DataSourceProps props) {
         // create data source
    }
}
@Configuration
public class AppTestCfg extends AppCfg {
    @Bean
    public DataSourceHandler getDataSourceHandler(){
        return new MockDataSourceHandler();
    }
    @Bean
    public DataSource getSource(){
        return null;
    }
}
@RunWith(SpringRunner.class)
@SpringBootTest(classes = AppTestCfg.class)
@EnableConfigurationProperties({DataSourceProps.class})
public class AppTest {
    // tests
}

Если я изменю подпись getSource в AppTestCfg следующим образом, оба DataSource и DataSourceHandler создаются с использованием AppTestCfg

@Bean
public DataSource getSource(DataSourceProps props){
    return null;
}

Ответы [ 2 ]

1 голос
/ 12 июня 2019

Почему бы не воспользоваться преимуществом аннотации Spring Boot @MockBean:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = AppTestCfg.class)
@EnableConfigurationProperties({DataSourceProps.class})
public class AppTest {

    @MockBean
    private DataSource dataSourceStub;
}

Это заменит любые вхождения любых компонентов этого интерфейса в контексте приложения и заменит их на фиктивную.

0 голосов
/ 12 июня 2019

Это потому, что типы объектов Бобов одинаковы.

Если вы хотите, чтобы два компонента были одного типа, вам нужно указать разные именованные компоненты. Попробуй конкретизировать имя нового компонента:

@Configuration
public class AppTestCfg extends AppCfg {
    @Bean(name="secondDataSourceHandler")
    public DataSourceHandler getMockDataSourceHandler(){
        return new MockDataSourceHandler();
    }
    @Bean
    public DataSource getSource(){
        return null;
    }
}
...