2015-05-21 95 views
0

我想为我的Spring MVC应用程序编写一个单元测试用例。我正在使用纯Java配置,没有XML。春季JUnit - java.lang.IllegalStateException:无法加载ApplicationContext

当我尝试运行我的测试类时,我得到以下堆栈跟踪。 (这是堆栈跟踪的只是一部分,完整的跟踪太大张贴在堆栈溢出。)

Related cause: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userMapper' defined in file [/Users/jkratz/Projects/knowledge-works/build/classes/main/org/ohiohighered/researchportal/core/persistence/UserMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionFactory': : Error creating bean with name 'sqlSessionFactory' defined in class path resource [org/ohiohighered/researchportal/core/config/PersistenceConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.mybatis.spring.SqlSessionFactoryBean]: Factory method 'sqlSessionFactory' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'datasource' defined in class path resource [org/ohiohighered/researchportal/core/config/PersistenceConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.sql.DataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: required key [jndi.datasource] not found; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in class path resource [org/ohiohighered/researchportal/core/config/PersistenceConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.mybatis.spring.SqlSessionFactoryBean]: Factory method 'sqlSessionFactory' threw exception; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'datasource' defined in class path resource [org/ohiohighered/researchportal/core/config/PersistenceConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.sql.DataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: required key [jndi.datasource] not found 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1202) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:537) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
    at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:368) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1111) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1006) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) 
    at org.springframework.context.support.PostProcessorRegistrationDelegate.registerBeanPostProcessors(PostProcessorRegistrationDelegate.java:220) 
    at org.springframework.context.support.AbstractApplicationContext.registerBeanPostProcessors(AbstractApplicationContext.java:615) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:465) 
    at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:125) 
    at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:60) 
    at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.delegateLoading(AbstractDelegatingSmartContextLoader.java:109) 
    at org.springframework.test.context.support.AbstractDelegatingSmartContextLoader.loadContext(AbstractDelegatingSmartContextLoader.java:261) 
    at org.springframework.test.context.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:68) 
    at org.springframework.test.context.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:86) 
    ... 28 more 
Caused by: java.lang.IllegalStateException: required key [aysnc.executor.poolSize] not found 
    at org.springframework.core.env.AbstractPropertyResolver.getRequiredProperty(AbstractPropertyResolver.java:160) 
    at org.springframework.core.env.AbstractEnvironment.getRequiredProperty(AbstractEnvironment.java:541) 
    at org.ohiohighered.researchportal.core.config.JobConfig.getAsyncExecutor(JobConfig.java:26) 
    at org.springframework.scheduling.annotation.AbstractAsyncConfiguration.setConfigurers(AbstractAsyncConfiguration.java:69) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:642) 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:331) 
    ... 53 more 

这里是我的测试类:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = AppConfig.class) 
public class CampusParserTest { 

    @Autowired 
    ApplicationContext applicationContext; 

    @Test 
    public void testParser() { 

     CampusParser campusParser = new CampusParser(); 
     campusParser.parse(); 
    } 
} 

出于某种原因,它似乎并不要实例化我的任何bean或找到任何属性/配置文件。这是我在Tomcat 8上运行的Spring MVC应用程序。数据源也是从JNDI加载的,我猜测这将是一个问题,但一次只能做一件事。

更新:这是我的PersistenceConfig。该应用程序加载和运行正常使用Tomcat 8

@Configuration 
@EnableTransactionManagement 
@MapperScan("org.app.researchportal.core.persistence") 
public class PersistenceConfig { 

    @Autowired 
    Environment environment; 

    /** 
    * Gets the datasource from the container using JNDI and returns it 
    * 
    * @return {@link DataSource} 
    */ 
    @Bean(name = "datasource") 
    public DataSource dataSource() { 
     JndiDataSourceLookup dsLookup = new JndiDataSourceLookup(); 
     dsLookup.setResourceRef(true); 
     return dsLookup.getDataSource(environment.getRequiredProperty("jndi.datasource")); 
    } 

    /** 
    * Creates and returns the MyBatis SqlSessionFactoryBean 
    * 
    * @return SqlSessionFactoryBean 
    * @throws Exception 
    */ 
    @Bean 
    public SqlSessionFactoryBean sqlSessionFactory() throws Exception { 
     SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); 
     sessionFactory.setDataSource(dataSource()); 
     sessionFactory.setTypeAliasesPackage("org.app.researchportal.core.domain"); 
     return sessionFactory; 
    } 

    /** 
    * creates the AtomikosTransactionManager bean for JTA transactions 
    * 
    * @return UserTransactionManager 
    */ 
    @Bean(name="AtomikosTransactionManager", initMethod = "init", destroyMethod = "close") 
    public UserTransactionManager userTransactionManager() { 
     UserTransactionManager userTransactionManager = new UserTransactionManager(); 
     userTransactionManager.setForceShutdown(false); 
     return userTransactionManager; 
    } 

    /** 
    * create the UserTransaction bean for Atomikos JTA implementation 
    * 
    * @return UserTransactionImp 
    * @throws SystemException 
    */ 
    @Bean(name = "AtomikosUserTransaction") 
    public UserTransactionImp userTransactionImp() throws SystemException{ 
     UserTransactionImp userTransactionImp = new UserTransactionImp(); 
     userTransactionImp.setTransactionTimeout(300); 
     return userTransactionImp; 
    } 

    /** 
    * create the JtaTransactionManger bean to manage transactions 
    * 
    * @return JtaTransactionManager 
    * @throws SystemException 
    */ 
    @Bean(name = "JtaTransactionManager") 
    public JtaTransactionManager jtaTransactionManager() throws SystemException { 
     JtaTransactionManager jtaTransactionManager = new JtaTransactionManager(); 
     jtaTransactionManager.setTransactionManager(userTransactionManager()); 
     jtaTransactionManager.setUserTransaction(userTransactionImp()); 
     return jtaTransactionManager; 
    } 

    /** 
    * creates Flyway bean to automatically handle database migrations 
    * 
    * @return Flyway 
    */ 
    @Bean(name = "flyway", initMethod = "migrate") 
    public Flyway flyway() { 
     Flyway flyway = new Flyway(); 
     flyway.setDataSource(dataSource()); 
     flyway.setOutOfOrder(false); 
     flyway.setBaselineOnMigrate(true); 
     flyway.setLocations("classpath:migrations"); 
     return flyway; 
    } 
} 
+0

你有一个循环依赖地方?它看起来像bean'dataSource'想要注入'sqlSessionFactory',它想要注入'dataSource',它想要注入'sqlSessionFactory',它想要......等等。 – Jesper

+0

我更新了这个问题。它在Tomcat中正常工作。无论出于何种原因,似乎不加载属性文件似乎是根本原因 – greyfox

+0

正在加载的属性文件没有“aysnc.executor.poolSize”,这是导致其他人的主要异常。所以添加@propertySource(“文件名”)来加载属性文件。 – Jango

回答

0

我想你一定忘记配置“数据源”,如:

<property name="driverClassName" value= 
<property name="url" value= 
相关问题