我正在將單元測試集成到我的項目中,我已經將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提前
錯誤是什麼? – 2012-02-19 03:28:59
當你不告訴我們錯誤是什麼(這至少指向它不能創建的bean)時,你如何指望我們告訴我們如何解決創建bean的錯誤... – AHungerArtist 2012-02-19 03:30:00
抱歉我忘了在這裏包括它,現在我已經編輯了我的文章,謝謝 – 123Ex 2012-02-19 03:31:33