2013-03-13 50 views
0

我正在使用基于注释的弹簧配置并尝试测试基于JPA的DAO。配置完成后,当我运行测试时,会引发下面的错误。我无法理解为什么即使在Test类中创建了Bean配置,也找不到IPartnerDao。Spring 3.2,jUnit 4.11,JPA NoSuchBeanDefinitionException:预计至少有一个bean

5173 [ERROR] org.springframework.test.context.TestContextManager - Caught exception while allowing TestExecutionListener [org.springframewor[email protected]3600e312] to prepare test instance [[email protected]148238f4] 
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'test.java.net.bornil.persistence.service.partner.PartnerDaoTest': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private main.java.net.bornil.persistence.service.IPartnerDao test.java.net.bornil.persistence.service.partner.PartnerDaoTest.parDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [main.java.net.bornil.persistence.service.IPartnerDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
     at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:288) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1120) 
     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:379) 
     at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:110) 
     at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:75) 
     at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:313) 
     at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:211) 
     at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:288) 
     at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
     at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:284) 
     at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231) 
     at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88) 
     at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) 
     at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) 
     at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) 
     at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) 
     at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) 
     at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 
     at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71) 
     at org.junit.runners.ParentRunner.run(ParentRunner.java:309) 
     at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174) 
     at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:53) 
     at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:123) 
     at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:104) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:164) 
     at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:110) 
     at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:175) 
     at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcessWhenForked(SurefireStarter.java:107) 
     at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:68) 
    Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private main.java.net.bornil.persistence.service.IPartnerDao test.java.net.bornil.persistence.service.partner.PartnerDaoTest.parDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [main.java.net.bornil.persistence.service.IPartnerDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
     at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:514) 
     at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87) 
     at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:285) 
     ... 32 more 
    Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [main.java.net.bornil.persistence.service.IPartnerDao] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 
     at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:967) 
     at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:837) 
     at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:749) 
     at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:486) 
     ... 34 more 

测试类

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(loader = AnnotationConfigContextLoader.class, classes = { JPAConfig.class }) 
public final class PartnerDaoTest { 

    @Configuration 
    static class ContextConfiguration { 

     @Bean 
     public IPartnerDao getParDao() { 
      return new PartnerDao(); 
     } 
    } 

    @Autowired 
    private IPartnerDao parDao; 

    @Test 
    public void testFindPartnerWithAddress() throws Exception { 
     Partner partner = parDao.findPartnerWithAddress(1L); 
     assertNotNull(partner); 
    } 
} 

的DAO类

@Repository 
@Transactional(readOnly = true) 
public class PartnerDao implements IPartnerDao { 

    private static Logger logger = Logger.getLogger(PartnerDao.class.getName()); 

    @PersistenceContext 
    private EntityManager em; 

    public PartnerDao() { 

    } 


    /* (non-Javadoc) 
    * @see main.java.net.bornil.persistence.service.IPartnerDao#find(java.lang.Long) 
    */ 
    @Override 
    public Partner findPartnerWithAddress(Long id) { 
     if (logger.isDebugEnabled()) { 
      logger.debug("Partner ID : " + id); 
     } 

     Query query = em.createQuery("select p from Partner p join fetch p.addressSet where p.id = :id"); 
     query.setParameter("id", id); 

     return (Partner) query.getSingleResult(); 
    } 

} 

的合伙接口

@Service 
public interface IPartnerDao { 

    public Partner findPartnerWithAddress(Long id); 

} 

JPAConfig类

@Configuration 
// @EnableLoadTimeWeaving 
@EnableTransactionManagement 
@PropertySource({ "classpath:jdbc.properties" }) 
public class JPAConfig { 

    @Autowired 
    Environment env; 

    @Bean 
    DataSource getJdbcDataSource() { 

     String jdbcUrl = env.getProperty("jdbc.url"); 
     String username = env.getProperty("jdbc.username"); 
     String password = env.getProperty("jdbc.password"); 

     return new DriverManagerDataSource(jdbcUrl, username, password); 
    } 

    @Bean 
    public PlatformTransactionManager getTransactionManager() { 
     JpaTransactionManager transactionManager = new JpaTransactionManager(); 
     transactionManager.setEntityManagerFactory(getEntityManagerFactoryBean().getObject()); 
     return transactionManager; 
    } 

    @Bean 
    public LocalContainerEntityManagerFactoryBean getEntityManagerFactoryBean() { 
     LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean(); 
     factory.setDataSource(getJdbcDataSource()); 
     factory.setPackagesToScan(new String[] { "main.java.net.bornil.persistence.entity" }); 

     HibernateJpaVendorAdapter hjva = new HibernateJpaVendorAdapter(); 
     hjva.setGenerateDdl(false); 
     hjva.setShowSql(true); 
     hjva.setDatabasePlatform("org.hibernate.dialect.MySQLDialect"); 

     factory.setJpaVendorAdapter(hjva); 
     return factory; 
    } 

} 
+0

发表你的'JPAConfig.class' – 2013-03-13 09:36:26

+0

新增JPAConfig类加载。 JPA配置实际上很好,因为我在部署后测试了应用程序。 – Mamun 2013-03-13 09:46:09

回答

1

确保您的JPAConfig.class上有组件扫描设置。

@ComponentScan("package.containing.PartnerDao") 
public class JPAConfig{ 

} 

也可以尝试添加测试的类由ContextLoader

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(loader = AnnotationConfigContextLoader.class, 
    classes = { JPAConfig.class, PartnerDaoTest.class }) 
public final class PartnerDaoTest { 

/** tests**/ 
} 
+0

谢谢凯文。它根据你的建议工作正常,但你能解释为什么内部类配置不起作用吗?我尝试了下面的方式,但没有工作。 '@Configuration @ComponentScan( “main.java.net.bornil.persistence.service”) 静态类ContextConfiguration {} ' – Mamun 2013-03-13 09:52:31

+0

@Mamun因此增加该注释固定的问题,但内部类没有加载? – 2013-03-13 09:54:02

+0

你说得对。我在我的评论中添加了另一种方法,但这也不起作用。 – Mamun 2013-03-13 09:55:22