@Autowired bean没有找到

时间:2013-02-12 18:55:05

标签: java spring unit-testing java-ee autowired

我在尝试将资源依赖项注入单元测试时遇到错误。 我的方法是编写一个TestConfig.java来替换用于管理bean连接的生产的applicationContext.xml。这样我就可以使用内存数据库运行它,只测试组件。

TestConfig.java

@Configuration
@EnableTransactionManagement
public class TestConfig {
@Bean
public DataSource dataSource() {
    DriverManagerDataSource ds = new DriverManagerDataSource();
    ds.setDriverClassName("org.hsqldb.jdbcDriver");
    ds.setUrl("jdbc:hsqldb:mem:testdb");
    ds.setUsername("sa");
    ds.setPassword("");
    return ds;

}

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(){

    LocalContainerEntityManagerFactoryBean lcemfb
        = new LocalContainerEntityManagerFactoryBean();

    lcemfb.setDataSource(this.dataSource());
    lcemfb.setPackagesToScan(new String[] {"com.dao","com.data"});
    lcemfb.setPersistenceUnitName("MyTestPU");

    HibernateJpaVendorAdapter va = new HibernateJpaVendorAdapter();
    lcemfb.setJpaVendorAdapter(va);

    Properties ps = new Properties();
    ps.put("hibernate.dialect", "org.hibernate.dialect.HSQLDialect");
    ps.put("hibernate.hbm2ddl.auto", "create");
    lcemfb.setJpaProperties(ps);

    lcemfb.afterPropertiesSet();

    return lcemfb;

}

@Bean
public PlatformTransactionManager transactionManager() {
    JpaTransactionManager tm = new JpaTransactionManager();
    tm.setEntityManagerFactory(this.entityManagerFactoryBean().getObject());

    return tm;
}

@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation(){
    return new PersistenceExceptionTranslationPostProcessor();
}

@Bean
public AutowiredAnnotationBeanPostProcessor autowiredAnnotationBeanPostProcessor()
{
    return new AutowiredAnnotationBeanPostProcessor();
}


}

ProductsDaoTest.java

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

 @Resource(name="com.dao.ProductsDao")
 private ProductsDao testDao;

 @Test
 public void testSaveProduct() {


     Product productA = new Product();
     testDao.save(productA);

     Set<Product> products = testDao.getAllProducts();

     assertNotNull(products);
 }   
}

错误是创建名为'com.dao.ProductsDaoTest'的bean时出错:注入资源依赖关系失败

因此找不到具有@Autowired sessionFactory的@Repository的ProductDao Bean。

所以我的猜测是,因为我没有使用xml命名bean,所以它无法找到它,尽管我认为它应该自动从setPackagesToScan()中获取它。那么有没有办法手动插入Bean映射,以便找到它?

更一般地说,这是测试Spring DAO配置的合理方法吗?

此致 伊恩

1 个答案:

答案 0 :(得分:4)

我认为你试图在@Resource注释中使用你的DAO bean的错误名称。您是否使用@Qualifier明确指定了ProductsDao bean的名称?如果不是,那么我记得默认情况下bean的名称将是productsDao。所以你应该注入你的DAO:

@Resource(name="productsDao")
private ProductsDao testDao;

如果您只有一个ProductDAO实现,那么只需写:

@Autowired
private ProductsDao testDao;

@Inject
private ProductsDao testDao;

如果您想为DAO指定特定名称,请使用下一个构造:

@Respository
@Qualifier(name="specificName")
public class ProductDAO...

修改

正如Boris所说,您还应该指定要扫描定义bean的类(使用@Component,@ Service,@ Repository注释的类......)。为此,您应该将@ComponentScan注释添加到配置类定义中。

@Configuration
@EnableTransactionManagement
@ComponentScan(basePackages = {"package_to_scan"})
public class TestConfig {...}