2013-02-12 214 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