복붙노트

[SPRING] Autowiring이 Spring 3.1.2, JUnit 4.10.0에서 작동하지 않습니다.

SPRING

Autowiring이 Spring 3.1.2, JUnit 4.10.0에서 작동하지 않습니다.

Spring 3.1.2, JUnit 4.10.0을 사용하고 두 버전 모두에 새로운 기능이 추가되었습니다. 주석 기반 autowiring을 사용할 수 없다는 문제가 있습니다.

아래에는 두 개의 샘플이 있는데, 주석을 사용하지 않고 잘 작동합니다. 두 번째 애노테이션을 사용하면 작동하지 않으며 이유를 찾을 수 없습니다. 나는 spring-mvc-test의 샘플을 거의 따라 갔다.

일:

package com.company.web.api;
// imports

public class ApiTests {   

    @Test
    public void testApiGetUserById() throws Exception {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("/com/company/web/api/ApiTests-context.xml");
        UserManagementService userManagementService = (UserManagementService) ctx.getBean("userManagementService");
        ApiUserManagementController apiUserManagementController = new ApiUserManagementController(userManagementService);
        MockMvc mockMvc = standaloneSetup(apiUserManagementController).build();

        // The actual test     
        mockMvc.perform(get("/api/user/0").accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk());
    }
}

userManagementService가 null이며 자동 실행되지 않기 때문에 실패합니다.

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration       // should default to ApiTests-context.xml in same package
public class ApiTests {

    @Autowired
    UserManagementService userManagementService;

    private MockMvc mockMvc;

    @Before
    public void setup(){
        // SetUp never gets called?!
    }

    @Test
    public void testGetUserById() throws Exception {

        // !!! at this point, userManagementService is still null - why? !!!       

        ApiUserManagementController apiUserManagementController 
            = new ApiUserManagementController(userManagementService);

        mockMvc = standaloneSetup(apiUserManagementController).build();

        // The actual test
        mockMvc.perform(get("/api/user/0").accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk());
    }
}

위의 두 테스트 클래스는 동일한 컨텍스트 구성을 사용해야하며 userManagementService는 여기에 정의되어 있습니다.

ApiTests-context.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:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xsi:schemaLocation="
            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/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mydb?useUnicode=true&amp;characterEncoding=utf8"/>
        <property name="username" value="user"/>
        <property name="password" value="passwd"/>
    </bean>

    <!-- Hibernate SessionFactory -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"
          p:dataSource-ref="dataSource" p:mappingResources="company.hbm.xml">
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
                <prop key="hibernate.generate_statistics">${hibernate.generate_statistics}</prop>
            </props>
        </property>
        <property name="eventListeners">
            <map>
                <entry key="merge">
                    <bean class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener"/>
                </entry>
            </map>
        </property>
    </bean>

    <!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"
          p:sessionFactory-ref="sessionFactory"/>

    <!-- ========================= BUSINESS OBJECT DEFINITIONS ========================= -->

    <context:annotation-config/>
    <tx:annotation-driven/>
    <context:mbean-export/>

    <!-- tried both this and context:component-scan -->
    <!--<bean id="userManagementService" class="com.company.web.hibernate.UserManagementServiceImpl"/>-->
    <context:component-scan base-package="com.company"/>

    <!-- Hibernate's JMX statistics service -->
    <bean name="application:type=HibernateStatistics" class="org.hibernate.jmx.StatisticsService" autowire="byName"/>

</beans>

UserManagementService (인터페이스) 및 UserManagementServiceImpl에는 @Service 주석이 있습니다.

두 가지 사소한 질문 / 관찰 : setup ()은 @Before 주석을 가지고 있더라도 결코 호출되지 않습니다. 게다가, 나는 'test'라는 이름으로 시작하지 않으면 내 테스트 메소드가 실행 / 인식되지 않는다는 것을 알아 차렸다. 그 테스트는 필자가 보았던 모든 봄 - mvc 테스트 샘플에서 그렇다.

Pom.hml :

    <dependency>
        <groupId>org.junit</groupId>
        <artifactId>com.springsource.org.junit</artifactId>
        <version>4.10.0</version>
        <scope>test</scope>
    </dependency>

최신 정보:

이 문제는 maven에서 테스트를 실행할 때만 발생합니다. 내 IDE (IntelliJ IDEA)에서 테스트를 실행하면 좋습니다.

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.12.3</version>
            <configuration>
                <includes>
                    <include>**/*Tests.java</include>
                </includes>
            </configuration>
        </plugin>

해결법

  1. ==============================

    1.Autowiring은 구성 요소 검사를 수행하지 않으면 일어날 수 없습니다.

    Autowiring은 구성 요소 검사를 수행하지 않으면 일어날 수 없습니다.

    왜 코드에서 주석 처리 했습니까?

    <!--<context:component-scan base-package="com.company"/>-->
    

    또한 다시 : junit. 일식에 있다면 junit의 POM 및 필터의 종속성 트리 뷰로 이동할 수 있습니다. 당신이 실제로 그 버전을 사용하고 있고 오래된 junit을 가져 오지 않았는지 확인하십시오.

    편집 : 좋아, 난 그냥 귀하의 설정을 확인 하고이 일을 할 수있었습니다. 내 유일한 추측은 당신이 어떻게 든 잘못된 테스트 주자로 그것을 실행하여 잘못된 junit을 사용하게 할 수 있다는 것입니다.

    2 (SOLVED) 편집 : 따라서 커스텀 버전의 junit을 사용하고 있기 때문에 문제가 발생합니다. Surefire는 제공된 junit 라이브러리를 찾고 찾을 수 없습니다. 결과적으로 junit 3으로 기본 설정됩니다. 이는 앱이 구성로드를 건너 뛰게하는 원인입니다.

    다음과 같이 사용자 지정 공급자를 명시 적으로 지정할 수 있습니다.

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.12.3</version>
        <dependencies>
          <dependency>
            <groupId>org.apache.maven.surefire</groupId>
            <artifactId>surefire-junit47</artifactId>
            <version>2.12.3</version>
          </dependency>
        </dependencies>
      </plugin>
    

    하지만 맞춤 리포지토리에서 제대로 작동하지 않는 것으로 나타났습니다. 가능한 경우 표준 버전의 junit을 사용하는 것이 좋습니다.

  2. ==============================

    2.특정 컨텍스트 구성 (예 :

    특정 컨텍스트 구성 (예 :

    @ContextConfiguration(locations = {"/file1.xml", "/file2.xml" })
    

    (필요한 경우 여러 파일과 함께이 파일을 사용하는 방법을 보여주는 것만으로도 충분할 수 있습니다.)

    편집 : 여기에 언급 된 AutowiredAnnotationBeanPostProcessor를 활성화 했습니까? http://www.mkyong.com/spring/spring-auto-wiring-beans-with-autowired-annotation/

  3. ==============================

    3.나는이 같은 문제가 있었다. My @Autowire는 내 IDE (SpringSource STS)에서 작동하지만 Maven을 사용하여 명령 줄에서 빌드 할 때 응용 프로그램 컨텍스트를로드하지 못합니다.

    나는이 같은 문제가 있었다. My @Autowire는 내 IDE (SpringSource STS)에서 작동하지만 Maven을 사용하여 명령 줄에서 빌드 할 때 응용 프로그램 컨텍스트를로드하지 못합니다.

    문제는 pom.xml에 대한 나의 의존성 때문이었습니다. JUnit의 Spring 버전을 사용하여 오류가 발생했습니다. 이것이 원래 게시물의 근본 원인이라고 생각합니다. 필자는 Maven 플러그인을 코딩 할 필요가 없었다.

    내가 바꿨다.

    <dependency>
        <groupId>org.junit</groupId>
        <artifactId>com.springsource.org.junit</artifactId>
        <version>4.7.0</version>
    </dependency>
    

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.10</version>
    </dependency>
    
  4. from https://stackoverflow.com/questions/12529667/autowiring-not-working-in-spring-3-1-2-junit-4-10-0 by cc-by-sa and MIT license