Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Bean creation exception in junit test in spring

I'm working on integrating unit test to the my project,I have added maven dependencies to the project . But I'm getting a bean creation error,I tried lot of ways , googled , found some articles related to the error. but these couldn't answer for my problem.

Here is my application.xml file

<?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>

Here is my test class.

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;
    }
}

Here is my service class

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();
    }
}

error

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

Can anyone tell me where i made the mistake here , I couldn't find it , Thankxx in advance

like image 530
123Ex Avatar asked Dec 31 '25 12:12

123Ex


1 Answers

I think it is a syntax problem within:

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

Try

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

instead.

like image 175
Ralph Avatar answered Jan 02 '26 03:01

Ralph



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!