2012-02-19 98 views
2

我正在將單元測試集成到我的項目中,我已經將maven依賴項添加到項目中。 但是我得到一個bean創建錯誤,我嘗試了很多方法,搜索了一下,發現了一些與錯誤有關的文章。但這些無法回答我的問題。春季junit測試中的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 

誰能告訴我在哪裏,我所犯的錯誤在這裏,我找不到它,Thankxx提前

+0

錯誤是什麼? – 2012-02-19 03:28:59

+0

當你不告訴我們錯誤是什麼(這至少指向它不能創建的bean)時,你如何指望我們告訴我們如何解決創建bean的錯誤... – AHungerArtist 2012-02-19 03:30:00

+0

抱歉我忘了在這裏包括它,現在我已經編輯了我的文章,謝謝 – 123Ex 2012-02-19 03:31:33

回答

0

我認爲這是一個語法問題:

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

嘗試

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

代替。

+0

thnx爲您的答覆,如果我改變這樣會給 錯誤測試: createPersonTest(taxi.com.service.impl.TestPersonService):無法加載ApplicationContext – 123Ex 2012-02-21 00:46:01

+0

你有其他的春天上下文文件比你貼? – Ralph 2012-02-21 08:21:50

+0

是的,我有,一個用於測試,另一個用於應用程序,但都包含除DB配置以外的相同配置(測試數據庫在內存中運行) – 123Ex 2012-02-21 15:31:24