通过自动装配sessionfactory bean的Junit测试问题

时间:2017-12-11 18:32:13

标签: spring spring-mvc junit

我正在尝试为我的应用程序实现一个简单的实体单元测试,但我得到了这个错误,虽然我尝试了很多解决方案

我正在使用Spring MVC和Hibernate。

这是我的上下文文件:

servlet的context.xml中



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

       <!-- DispatcherServlet Context: defines this servlet's request-processing
           infrastructure -->

       <!-- Enables the Spring MVC @Controller programming model -->
       <annotation-driven />
       <context:component-scan base-package="teams"/>
       <context:component-scan base-package="teams.*"/>

       <!-- Handles HTTP GET requests for /resources/** by efficiently serving
           up static resources in the ${webappRoot}/resources directory -->
       <resources mapping="/resources/**" location="/resources/" />

       <!-- Resolves views selected for rendering by @Controllers to .jsp resources
           in the /WEB-INF/views directory -->
       <beans:bean
               class="org.springframework.web.servlet.view.InternalResourceViewResolver">
              <beans:property name="prefix" value="/WEB-INF/views/" />
              <beans:property name="suffix" value=".jsp" />
       </beans:bean>

        <!-- Database connection Bean definition -->
       <beans:bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
                   destroy-method="close">
              <beans:property name="driverClassName" value="com.mysql.jdbc.Driver" />
              <beans:property name="url"
                              value="jdbc:mysql://localhost:3306/teams" />
              <beans:property name="username" value="root" />
              <beans:property name="password" value="root" />
       </beans:bean>

       <!-- Hibernate 4 SessionFactory Bean definition -->
       <beans:bean id="hibernate4AnnotatedSessionFactory"
                   class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
              <beans:property name="dataSource" ref="dataSource"/>
              <beans:property name="annotatedClasses">
                     <beans:list>
                            <beans:value>teams.model.Team</beans:value>
                     </beans:list>
              </beans:property>
              <beans:property name="hibernateProperties">
                     <beans:props>
                            <beans:prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect
                            </beans:prop>
                            <beans:prop key="hibernate.show_sql">true</beans:prop>
                            <beans:prop key="hibernate.hbm2ddl.auto">create</beans:prop>
                            <beans:prop key="hibernate.connection.charset">UTF-8</beans:prop>
                     </beans:props>
              </beans:property>
       </beans:bean>

        <!-- DAO and Service Beans definition -->
       <beans:bean id="teamDAO" class="teams.dao.TeamDAOImpl">
              <beans:property name="sessionFactory" ref="hibernate4AnnotatedSessionFactory" />
       </beans:bean>
       <beans:bean id="teamService" class="teams.service.TeamServiceImpl">
              <beans:property name="teamDAO" ref="teamDAO"></beans:property>
       </beans:bean>

    <!-- Enabling Transaction manager -->
       <tx:annotation-driven transaction-manager="transactionManager"/>

    <!-- Config Transaction Manager -->
       <beans:bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
              <beans:property name="sessionFactory" ref="hibernate4AnnotatedSessionFactory" />
       </beans:bean>

</beans:beans>
&#13;
&#13;
&#13;

我的实体是 Team.java

&#13;
&#13;
package teams.model;

import javax.persistence.*;

import org.apache.commons.lang.builder.EqualsBuilder;

/**
 * Entity bean with JPA annotations
 * Hibernate provides JPA implementation
 *
 */
@Entity
@Table(name = "teams")
public class Team {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private String name;

    private Integer rating;

    public Team() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getRating() {
        return rating;
    }

    public void setRating(Integer rating) {
        this.rating = rating;
    }

    @Override
    public String toString(){
        return "id="+id+", name="+name+", rating="+rating;
    }
    @Override
    public boolean equals(Object obj) {
        if (obj instanceof Team == false) {
            return false;
        }
        if (this == obj) {
            return true;
        }
        final Team team = (Team) obj;
        return new EqualsBuilder().append(id, team.getId())
                .append(name, team.getName()).append(rating, team.getRating())
                .isEquals();
    }
}
&#13;
&#13;
&#13;

这是我实体的测试对象:

&#13;
&#13;
package teams;

import java.util.List;

import junit.framework.Assert;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.junit.AfterClass;
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 teams.model.Team;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath*:/spring/servlet-context*.xml") 
public class TeamTest {

	static Session  session;
	 
    @Autowired
    public void setFactory(SessionFactory factory) {
        session = factory.openSession();
    }
 
    @Test
    public void testConfiguration() {
        // Setup
        Team team = new Team();
        team.setName("Palo");
        team.setRating(9);

        session.beginTransaction();
        // Action
        team=(Team) session.merge(team);
        List teams = session.createCriteria(Team.class).list();
        // Test
        Assert.assertEquals(1, teams.size());
        Assert.assertEquals(team, teams.get(0));
    }
 
    @AfterClass
    public static void tearDown(){
        session.close();
    }
}
&#13;
&#13;
&#13; 这是问题的输出:

&#13;
&#13;
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'teams.TeamTest': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void teams.TeamTest.setFactory(org.hibernate.SessionFactory); nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.hibernate.SessionFactory] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:292)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1185)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireBeanProperties(AbstractAutowireCapableBeanFactory.java:384)
	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:319)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:212)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289)
	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:232)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:89)
	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.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
	at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
	at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
	at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:175)
	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void teams.TeamTest.setFactory(org.hibernate.SessionFactory); nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.hibernate.SessionFactory] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:596)
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:87)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:289)
	... 27 more
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.hibernate.SessionFactory] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {}
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1103)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:963)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:858)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredMethodElement.inject(AutowiredAnnotationBeanPostProcessor.java:553)
	... 29 more
2017-12-11 18:06:33 DEBUG DirtiesContextTestExecutionListener:126 - After test class: context [DefaultTestContext@3e6358 testClass = TeamTest, testInstance = [null], testMethod = [null], testException = [null], mergedContextConfiguration = [MergedContextConfiguration@15f7ae5 testClass = TeamTest, locations = '{classpath*:/spring/servlet-context*.xml}', classes = '{}', contextInitializerClasses = '[]', activeProfiles = '{}', contextLoader = 'org.springframework.test.context.support.DelegatingSmartContextLoader', parent = [null]]], dirtiesContext [false].
2017-12-11 18:06:33 INFO  GenericApplicationContext:873 - Closing org.springframework.context.support.GenericApplicationContext@9d9c55: startup date [Mon Dec 11 18:06:33 GMT+01:00 2017]; root of context hierarchy
2017-12-11 18:06:33 DEBUG DefaultListableBeanFactory:249 - Returning cached instance of singleton bean 'lifecycleProcessor'
2017-12-11 18:06:33 DEBUG DefaultListableBeanFactory:474 - Destroying singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@874448: defining beans [org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor,org.springframework.context.annotation.internalPersistenceAnnotationProcessor,org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor,org.springframework.context.annotation.ConfigurationClassPostProcessor.enhancedConfigurationProcessor]; root of factory hierarchy
&#13;
&#13;
&#13;

每次运行测试时,即使我试图测试Dao或控制器类,也会出现这些错误,但我仍然遇到同样的问题。

你可以帮我解决这个问题吗?如果代码有问题我怎么纠正呢?

0 个答案:

没有答案
相关问题