0

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

测试配置.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);
 }   
}

错误是 Error created bean with name 'com.dao.ProductsDaoTest': Injection of resource dependencies failed

所以它找不到ProductDao Bean,它是一个带有@Autowired sessionFactory 的@Repository。

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

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

问候,伊恩

4

1 回答 1

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 {...}
于 2013-02-12T19:07:28.333 回答