Spring 集成测试加载注释 Bean

Spring Integration Test Loading Annotated Beans

出于某种原因,当我单独使用@ComponentScan 时,我的 DAO 没有加载。

我的 DAO:

@Repository
public class MyDAO{
  @Autowire
  private Datasource ds;
}

我的配置 class(只是用嵌入式数据库覆盖数据源 bean):

@Configuration
public class TestConfig extends AppConfig {

    @Bean
    public Datasource getDatasource() throws Exception{...}

我的测试Class:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {TestConfig.class})
@ComponentScan
public class MyDAOTest {

    @Autowired
    private MyDAO target;

我的理解是@ComponentScan 应该能够找到 MyDAO 并加载它(TestConfig class 中的数据源加载得很好)。但是,未加载 MyDAO。我得到 "org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.acme.dao.MyDAO] found for dependency." 我还尝试在 @ComponentScan 中指定包,例如 com.acme 或 com.acme.dao。

当我将 MyDAO.class 作为 class 之一包含在 @ContextConfiguration 中时,它工作正常。但是,我不想为我的集成测试列出所有 classes...

以下设置将从 AppConfig 加载默认 bean,同时覆盖 TestConfig 中指定的任何 bean。 TestConfig 可以是嵌套的 class(在 MyDAOTest 中),只要它被声明为静态即可。

@ContextConfiguration( classes = TestConfig.class )
@RunWith(SpringJUnit4ClassRunner.class)
public class MyDAOTest {
    ...
}

@Import(AppConfig.class)
public class TestConfig {
    @Bean public Datasource getDatasource() throws Exception {...}
}

@Configuration
@ComponentScan( basePackages = {"com.acme"})
public class AppConfig {
    ....
}