2013-02-12 168 views
0

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

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' 创建豆:资源依赖注射失败

所以它无法找到ProductDao Bean,它是@Repository和@Autowired sessionFactory。

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

另外更普遍的是这是一个合理的方式去测试Spring DAO配置?

问候, 伊恩

+0

你确定LocalContainerEntityManagerFactoryBean被正确初始化吗?如果你在entityManagerFactoryBean中放置了一个断点,你打了吗?我认为Spring没有办法知道要初始化哪个bean来初始化ProductsDao。 – 2013-02-12 19:02:12

+1

声明context-component-scan在哪里?我没有看到它在测试或我错过了什么..请注意,由休眠扫描的包不是一样的事情春天 – 2013-02-12 19:12:32

回答

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... 

编辑:

正如鲍里斯指出你还应该指定扫描定义豆类(带@Component,@Service,@Repository ...注解的类)的包。为此,您应该将@ComponentScan注释添加到您的配置类定义中。

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

的组件扫描,请在类配置 – 2013-02-12 19:20:15

+0

声明组件扫描添加信息谢谢,我错过了这个。我已经编辑了我的答案,并使用@ComponentScan发布了示例。 – dimas 2013-02-12 19:25:40

+0

谢谢,我现在会测试它。 @Resource是因为它不适用于Autowired,因此我正在测试其他注释以查看是否有帮助。 我以为setPackagesToScan基本上做了同样的事情。嗯。 – Iain 2013-02-13 10:18:23