복붙노트

[SPRING] JUnit을 사용한 유닛 테스트에서 스프링이 자동 와이어 링되지 않음

SPRING

JUnit을 사용한 유닛 테스트에서 스프링이 자동 와이어 링되지 않음

JUnit을 사용하여 다음 DAO를 테스트합니다.

@Repository
public class MyDao {

    @Autowired
    private SessionFactory sessionFactory;

    // Other stuff here

}

보시다시피 sessionFactory는 Spring을 사용하여 autowired입니다. 테스트를 실행하면 sessionFactory가 null로 유지되고 널 포인터 예외가 발생합니다.

이것은 Spring의 sessionFactory 설정이다.

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="configLocation">
        <value>classpath:hibernate.cfg.xml</value>
    </property>
    <property name="configurationClass">
        <value>org.hibernate.cfg.AnnotationConfiguration</value>
    </property>
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${jdbc.dialect}</prop>
            <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>
</bean>

뭐가 문제 야? 유닛 테스트 도구에 대해 자동 와이어 링을 활성화하려면 어떻게해야합니까?

업데이트 : JUnit 테스트를 실행할 수있는 유일한 방법인지는 모르겠지만 테스트 파일을 마우스 오른쪽 버튼으로 클릭하고 "다음으로 실행"-> "JUnit 테스트"를 선택하여 이클립스에서 실행하고 있음을 유의하십시오.

해결법

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

    1.루트 유닛 테스트 클래스에 다음과 같이 추가하십시오.

    루트 유닛 테스트 클래스에 다음과 같이 추가하십시오.

    @RunWith( SpringJUnit4ClassRunner.class )
    @ContextConfiguration
    

    이렇게하면 기본 경로에서 XML이 사용됩니다. 기본값이 아닌 경로를 지정해야하는 경우 ContextConfiguration 주석에 locations 속성을 제공 할 수 있습니다.

    http://static.springsource.org/spring/docs/2.5.6/reference/testing.html

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

    2.컨텍스트에서 스프링 빈을 연결하려면 Spring JUnit 러너를 사용해야합니다. 아래 코드는 테스트 클래스 경로에서 testContest.xml이라는 응용 프로그램 컨텍스트를 사용할 수 있다고 가정합니다.

    컨텍스트에서 스프링 빈을 연결하려면 Spring JUnit 러너를 사용해야합니다. 아래 코드는 테스트 클래스 경로에서 testContest.xml이라는 응용 프로그램 컨텍스트를 사용할 수 있다고 가정합니다.

    import org.hibernate.SessionFactory;
    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 java.sql.SQLException;
    
    import static org.hamcrest.MatcherAssert.assertThat;
    import static org.hamcrest.Matchers.startsWith;
    
    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration(locations = {"classpath*:**/testContext.xml"})
    @Transactional
    public class someDaoTest {
    
        @Autowired
        protected SessionFactory sessionFactory;
    
        @Test
        public void testDBSourceIsCorrect() throws SQLException {
            String databaseProductName = sessionFactory.getCurrentSession()
                    .connection()
                    .getMetaData()
                    .getDatabaseProductName();
            assertThat("Test container is pointing at the wrong DB.", databaseProductName, startsWith("HSQL"));
        }
    }
    

    주의 : 이것은 Spring 2.5.2와 Hibernate 3.6.5에서 작동한다.

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

    3.구성에서 컨텍스트 파일 위치가 누락되면이를 해결할 수있는 한 가지 방법이 발생할 수 있습니다.

    구성에서 컨텍스트 파일 위치가 누락되면이를 해결할 수있는 한 가지 방법이 발생할 수 있습니다.

    처럼:

    @ContextConfiguration(locations = { "classpath:META-INF/your-spring-context.xml" })
    

    자세한 내용은

    @RunWith( SpringJUnit4ClassRunner.class )
    @ContextConfiguration(locations = { "classpath:META-INF/your-spring-context.xml" })
    public class UserServiceTest extends AbstractJUnit4SpringContextTests {}
    

    참고 : @Xstian에 감사드립니다.

  4. ==============================

    4.SpringJunitRunner를 사용하도록 주석을 Junit 클래스에 추가해야한다. 당신이 원하는 것들 :

    SpringJunitRunner를 사용하도록 주석을 Junit 클래스에 추가해야한다. 당신이 원하는 것들 :

    @ContextConfiguration("/test-context.xml")
    @RunWith(SpringJUnit4ClassRunner.class)
    

    이렇게하면 Junit은 test-context.xml 파일을 테스트와 동일한 디렉토리에서 사용하게된다. 이 파일은 봄에 사용하는 실제 context.xml과 유사해야하지만 자연스럽게 테스트 자원을 가리키고 있어야합니다.

  5. from https://stackoverflow.com/questions/17623694/spring-not-autowiring-in-unit-tests-with-junit by cc-by-sa and MIT license