春天没有注入测试豆

时间:2019-06-12 16:10:43

标签: spring unit-testing spring-boot mocking autowired

在SpringBoot测试中,在 AppTestCfg 中创建了 DataSourceHandler ,但是在 AppCfg 中创建了 DataSource 。为什么它们都不都在 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
}

如果我按以下方式更改 AppTestCfg 中的 getSource 的签名,则会使用以下命令创建 DataSource DataSourceHandler AppTestCfg

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

2 个答案:

答案 0 :(得分:1)

为什么不利用Spring Boot的@MockBean注释:

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

    @MockBean
    private DataSource dataSourceStub;
}

这将替换在应用程序上下文中该接口的任何bean的任何出现,并将它们替换为模拟。

答案 1 :(得分:0)

这是因为Bean的对象类型相同。

如果要使用两个相同类型的bean,则必须指定不同的命名bean。尝试具体说明新bean的名称:

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