0

単体テストにリソースの依存関係を挿入しようとするとエラーが発生します。私のアプローチは、Beanの接続を管理する本番用のapplicationContext.xmlを置き換えるTestConfig.javaを作成することでした。インメモリデータベースで実行し、コンポーネントをテストするだけです。

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の作成中にエラーが発生しました:リソースの依存関係の注入に失敗しました

したがって、@AutowiredsessionFactoryを持つ@RepositoryであるProductDaoBeanが見つかりません。

だから私の推測では、xmlを使用してBeanに名前を付けていないため、それを見つけることができませんが、setPackagesToScan()から自動的に取得する必要があると思いました。では、Beanマッピングを手動で挿入して見つけられるようにする方法はありますか?

また、より一般的には、これはSpring DAO構成のテストを行うための合理的な方法ですか?

よろしく、イアン

4

1 に答える 1

4

@ResourceアノテーションでDAOBeanの間違った名前を使用しようとしていると思います。@Qualifierを使用してProductsDaoBeanの名前を明示的に指定しましたか?いいえの場合、デフォルトで覚えているように、Beanの名前はproductsDaoになります。したがって、次のようにDAOを注入する必要があります。

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

ProductDAOの実装が1つしかない場合は、次のように記述します。

@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 に答える