在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;
}
答案 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;
}
}