2016-09-30 42 views
1

加载整个的applicationContext我已经与下一个代码春天创建一个JUnit测试:春天的JUnit不会从XML

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { 
    "classpath:*/WEB-INF/demo-servlet.xml"}) 
public class CrudTestJUnit extends AbstractJUnit4SpringContextTests { 

    @Autowired 
    protected ShoppingCartDao shoppingCartDao; 

    @Autowired 
    private ApplicationContext context; 

    @Before 
    public void setUp(){ 

    } 

    @Test 
    public void testSomething() { 
     System.out.println("Evo beanvoa:" + Arrays.toString(context.getBeanDefinitionNames())); 
     Assert.assertTrue(false); 
    } 
} 

在演示servlet.xml中,我定义的bean:

<bean id="shoppingCartDao" class="com.it355.hibernatecrud.dao.impl.ShoppingCartDaoImpl"></bean> 

当我运行JUnit测试我得到这个错误:

Error creating bean with name 'CrudTestJUnit': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: protected com.it355.hibernatecrud.dao.ShoppingCartDao CrudTestJUnit.shoppingCartDao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [com.it355.hibernatecrud.dao.ShoppingCartDao] found for dependency: 

当我删除的购物车我得到这个从getBeanDefinitionNames():

Evo beanvoa:[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.event.internalEventListenerProcessor, 
org.springframework.context.event.internalEventListenerFactory, 
org.springframework.context.annotation.ConfigurationClassPostProcessor.importAwareProcessor, org.springframework.context.annotation.ConfigurationClassPostProcessor.enhancedConfigurationProcessor] 

这里是我的全部演示servlet.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:mvc="http://www.springframework.org/schema/mvc" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
          http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
          http://www.springframework.org/schema/context 
          http://www.springframework.org/schema/context/spring-context-4.0.xsd 
          http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd 
          http://www.springframework.org/schema/tx 
          http://www.springframework.org/schema/tx/spring-tx.xsd"> 

    <!--Kako bi Hibernate mogao da se poveže na bazu podataka potrebno je kreirati sesiju. To radimo u sledećem 
    zrnu--> 
    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <property name="configLocation" > 
      <!--Dodavanje path-a na kome se nalaze podešavanja za Hibernate --> 
      <value>classpath:hibernate.cfg.xml</value> 
     </property> 
     <!-- Dodavanje path-a paketa u kome se nalaze entity fajlovi na osnovu kojih 
     će Hibernate kreirati bazu i upisivati u nju--> 
     <property name="packagesToScan"> 
      <list> 
       <value>com.it355.hibernatecrud.entity</value> 
      </list> 
     </property> 
    </bean> 

    <!--Transakcija se dešava između baze i programa korišćenjem Transaction Managera koji definišemo ovde 
    On koristi sesiju koju smo definisali iznad --> 
    <tx:annotation-driven transaction-manager="transactionManager"/> 

    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 

    <bean id="shoppingCartDao" class="com.it355.hibernatecrud.dao.impl.ShoppingCartDaoImpl"></bean> 
    <bean id="persistenceExceptionTranslationPostProcessor" 
      class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/> 

    <context:component-scan base-package="com.it355.hibernatecrud" /> 
    <mvc:annotation-driven conversion-service="conversionService" /> 
    <tx:annotation-driven /> 

    <mvc:default-servlet-handler /> 

    <mvc:resources mapping="/css/**" location="/WEB-INF/css/"/> 
    <mvc:resources mapping="/resources/**" location="/WEB-INF/" /> 
    <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean"> 
     <property name="converters"> 
      <set> 
       <bean class="com.it355.hibernatecrud.converter.IntegerToCategory" /> 
      </set> 
     </property> 
    </bean> 
    <bean 
     class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="prefix" value="/WEB-INF/jsp/"></property> 
     <property name="suffix" value=".jsp"></property> 
    </bean> 

</beans> 

我错在调用配置文件或一些其他的事情吗?有没有人遇到同样的问题?

另外在我的配置文件中,我配置了组件扫描,并且我的应用程序工作并加载了没有任何问题的bean,但是JUnit出现了问题。

+0

我认为你应该使用@RunWith注解或扩展Spring测试类,而不是两者都尝试去除extends部分。 –

+0

我遇到了同样的问题,有或没有扩展Spring测试类 –

+0

好吧,看起来配置不应该在WEB-INF中,它不能在单元测试中轻松访问,而是在src/main/resources(或者只是测试src/test/resources),然后你可以在@ContextConfiguration(locations =“/demo-servlet.xml”) –

回答

0

在最后,我发现了从WEB-INF该配置必须加载这样的:

@ContextConfiguration(locations = { "file:src/main/webapp/WEB-INF/demo-servlet.xml"}) 
1

看来你的XML配置文件无法找到或正确加载,因此你不能够正确进行注射。

我建议只使用classpath,如果您的XML配置文件在您的CLASSPATH中,则不需要提及WEB-INF等。像这样:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration("classpath:demo-servlet.xml") 
public class CrudTestJUnit extends AbstractJUnit4SpringContextTests { 
}