単体テストにリソースの依存関係を挿入しようとするとエラーが発生します。私のアプローチは、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構成のテストを行うための合理的な方法ですか?
よろしく、イアン