2016-09-30 10 views
1

Я создал тест JUnit весной со следующим кодом:Spring JUnit не загружая весь ApplicationContext из 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 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> 

я не прав в призыве конфигурационный файл или какой-либо другой вещи? Есть кто-то, у кого была такая же проблема.

Также в моем файле конфигурации у меня настроено сканирование компонентов, и мое приложение работает и загружает компоненты без каких-либо проблем, но JUnit создает проблему.

+0

Я думаю, что вы должны либо использовать аннотацию @RunWith, либо расширить класс тестирования Spring, а не обе, попробуйте удалить часть extends. –

+0

Я получаю ту же проблему с расширением класса Spring или без него. –

+0

Хорошо, похоже, что config не должен быть в 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 не может быть найден или загружен правильно, таким образом, вы не способный правильно делать инъекции.

Предлагаю просто использовать путь к классам, если ваш файл конфигурации XML находится в пределах вашего CLASSPATH, нет необходимости упоминать WEB-INF и т. Д. '. Пример:

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