【问题标题】:Bean creation exception in junit test in spring春季junit测试中的bean创建异常
【发布时间】:2012-02-19 03:26:01
【问题描述】:

我正在将单元测试集成到我的项目中,我已将 maven 依赖项添加到项目中。 但是我遇到了一个bean创建错误,我尝试了很多方法,谷歌搜索,找到了一些与错误相关的文章。但这些无法解决我的问题。

这是我的 application.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
      http://www.springframework.org/schema/context  
      http://www.springframework.org/schema/context/spring-context-3.0.xsd  
      http://www.springframework.org/schema/tx  
      http://www.springframework.org/schema/tx/spring-tx-3.0.xsd  
      http://www.springframework.org/schema/aop  http://www.springframework.org/schema/aop/spring-aop-3.0.xsd">


    <context:property-placeholder location="classpath*:*.properties" />

    <tx:annotation-driven transaction-manager="transactionManager" />
<!--    <tx:annotation-driven /> -->
    <context:annotation-config />
    <context:component-scan base-package="taxi.com" />
<!--    <aop:aspectj-autoproxy /> -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        p:driverClassName="org.hsqldb.jdbcDriver" p:url="jdbc:hsqldb:mem:test"
        p:username="sa" p:password="" />

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"
        p:entityManagerFactory-ref="entityManagerFactory" p:dataSource-ref="dataSource" />

    <bean id="entityManagerFactory"
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
        p:dataSource-ref="dataSource" p:jpaVendorAdapter-ref="jpaAdapter">
        <property name="persistenceUnitName" value="test"></property>
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.hbm2ddl.auto">create-drop</prop>
                <prop key="hibernate.show_sql">true</prop>
                <prop key="hibernate.format_sql">true</prop>
                <prop key="hibernate.use_sql_comments">true</prop>
                <prop key="hibernate.current_session_context_class">org.springframework.orm.hibernate3.SpringSessionContext
                </prop>
            </props>
        </property>

    </bean>

    <bean id="jpaAdapter"
        class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
        p:databasePlatform="org.hibernate.dialect.HSQLDialect" p:generateDdl="true"
        p:showSql="true">
    </bean>

    <bean id="hibernateSessionFactory" factory-bean="entityManagerFactory"
        factory-method="getSessionFactory" />

    <bean id="persistenceAnnotation"
        class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
    <bean
        class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor" />

    <bean
        class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor" />
    <bean id="personDao" class="taxi.com.dao.impl.PersonDaoImpl" />
    <bean id="personService" class="taxi.com.service.impl.PersonServiceImpl" />
</beans>

这是我的测试课。

package taxi.com.service.impl;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;

import taxi.com.model.Person;

//
// IMPORTS
// NOTE: Import specific classes without using wildcards.
//

/**
 * <p>
 * Test classes for the {@link PersonServiceImpl}.
 * </p>
 * 
 * @author UdeRox
 * 
 * @version $Id$
 **/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
    "classpath*:*/applicationContext.xml"
})
public class TestPersonService
{
    @PersistenceContext
    private EntityManager entityManager;

    @Autowired
    private PersonServiceImpl personService;


    /**
     * <p>
     * Test the method in {@link PersonServiceImpl#create(taxi.com.model.Person)}.
     * </p>
     */
    @Test
    @Transactional
    public void createPersonTest()
    {
                personService.create(new Person());
    }

    /**
     * <p>
     * Getter for personService.
     * </p>
     * 
     * @return the personService
     */
    public PersonServiceImpl getPersonService()
    {
        return personService;
    }

    /**
     * <p>
     * Setting value for personService.
     * </p>
     * 
     * @param personService the personService to set
     */
    public void setPersonService(PersonServiceImpl personService)
    {
        this.personService = personService;
    }
}

这是我的服务类

package taxi.com.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import taxi.com.dao.IPersonDao;
import taxi.com.dao.impl.PersonDaoImpl;
import taxi.com.model.Person;
import taxt.com.service.IPersonService;

//
// IMPORTS
// NOTE: Import specific classes without using wildcards.
//

/**
 * <p>
 * Implementation of {@link IPersonService}.
 * 
 * @author UdeRox
 * 
 * @version $Id$
 **/
@Service("personService")
@Transactional
public class PersonServiceImpl implements IPersonService
{

//    @Autowired
    private PersonDaoImpl personDao;

    /**
     * {@inheritDoc}
     * 
     * @see taxt.com.service.IPersonService#create(taxi.com.model.Person)
     */
    @Override
    public void create(Person person)
    {
        personDao.create(person);
    }

    /**
     * {@inheritDoc}
     * 
     * @see taxt.com.service.IPersonService#update(taxi.com.model.Person)
     */
    @Override
    public void update(Person person)
    {
        personDao.update(person);
    }

    /**
     * {@inheritDoc}
     * 
     * @see taxt.com.service.IPersonService#findById(java.lang.Long)
     */
    @Override
    public Person findById(Long id)
    {
        return personDao.findById(id);
    }

    /**
     * {@inheritDoc}
     * 
     * @see taxt.com.service.IPersonService#findAll()
     */
    @Override
    public List<Person> findAll()
    {
        return personDao.findAll();
    }
}

错误

Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.86 sec <<< FAILURE!
createPersonTest(taxi.com.service.impl.TestPersonService)  Time elapsed: 0.5 sec  <<< ERROR!
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'taxi.com.service.impl.TestPersonService': Injection of persistence dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [javax.persistence.EntityManagerFactory] is defined: expected single bean but found 0
    at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessPropertyValues(PersistenceAnnotationBeanPostProcessor.java:341)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1074)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:374)
    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:321)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:220)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:301)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:303)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:240)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
    at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
    at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180)
    at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:35)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:115)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:97)
    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.booter.ProviderFactory$ClassLoaderProxy.invoke(ProviderFactory.java:103)
    at $Proxy0.invoke(Unknown Source)
    at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:150)
    at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcess(SurefireStarter.java:91)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:69)
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [javax.persistence.EntityManagerFactory] is defined: expected single bean but found 0
    at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findDefaultEntityManagerFactory(PersistenceAnnotationBeanPostProcessor.java:536)
    at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.findEntityManagerFactory(PersistenceAnnotationBeanPostProcessor.java:495)
    at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor$PersistenceElement.resolveEntityManager(PersistenceAnnotationBeanPostProcessor.java:656)
    at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor$PersistenceElement.getResourceToInject(PersistenceAnnotationBeanPostProcessor.java:629)
    at org.springframework.beans.factory.annotation.InjectionMetadata$InjectedElement.inject(InjectionMetadata.java:147)
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:84)
    at org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor.postProcessPropertyValues(PersistenceAnnotationBeanPostProcessor.java:338)
    ... 32 more

谁能告诉我这里哪里出错了,我没找到,先谢谢xx

【问题讨论】:

  • 当您不告诉我们错误是什么时,您希望我们如何告诉我们如何修复 bean 创建错误(至少会指向它不能指向的 bean创建)...
  • 对不起,我忘了把它放在这里,现在我已经编辑了我的帖子,谢谢
  • 此外,尝试删除在尝试解决问题时不直接有用的伪影,例如 getter 和 setter cmets——它们在最好的时候是噪音,仅用于占用垂直这里有空格。

标签: spring maven junit


【解决方案1】:

我认为这是一个语法问题:

@ContextConfiguration(locations = { "classpath*:*/applicationContext.xml")

试试

@ContextConfiguration(locations = { "classpath:applicationContext.xml")

改为。

【讨论】:

  • 谢谢你的回复,如果我这样改变它会给出错误的测试:createPersonTest(taxi.com.service.impl.TestPersonService): Failed to load ApplicationContext
  • 除了您发布的文件之外,您还有其他 spring 上下文文件吗?
  • 是的,我有,一个用于测试,另一个用于应用程序,但两者都包含相同的配置,除了数据库配置(测试数据库在内存上运行)
  • classpath:applicationContext.xml加载的那个包含错误。 -- 如果你发布完整的堆栈,我可以给你一个提示。
  • 您好,非常感谢,我已将我的错误堆栈包含在问题中,我认为您可以在问题中看到它,如果您能为此提供答案,我真的很感激
猜你喜欢
  • 1970-01-01
  • 2011-09-26
  • 2015-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多