programing

JUNit을 사용한 유닛 테스트에서 스프링이 자동 배선되지 않음

lovecodes 2023. 8. 13. 10:09
반응형

JUNit을 사용한 유닛 테스트에서 스프링이 자동 배선되지 않음

Junit로 다음 DAO를 테스트합니다.

@Repository
public class MyDao {

    @Autowired
    private SessionFactory sessionFactory;

    // Other stuff here

}

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

다음은 봄의 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 테스트를 실행하는 유일한 방법인지는 모르겠지만 테스트 파일을 마우스 오른쪽 버튼으로 클릭하고 "다른 이름으로 실행"을 선택하여 Eclipse에서 실행하고 있습니다.Junit 테스트"

루트 단위 테스트 클래스에 다음과 같은 것을 추가합니다.

@RunWith( SpringJUnit4ClassRunner.class )
@ContextConfiguration

기본 경로에 XML이 사용됩니다.기본값이 아닌 경로를 지정해야 하는 경우 컨텍스트 구성 주석에 위치 정보를 제공할 수 있습니다.

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

Spring Boot 2.1.1과 JUNit 4에서도 같은 문제가 있었습니다.
방금 주석을 추가했습니다.

@RunWith( SpringRunner.class )
@SpringBootTest

모든 것이 잘 되었습니다.

6월 5일의 경우:

@ExtendWith(SpringExtension.class)

원천

저는 JUNit 5를 사용하고 있는데 문제는 제가 수입한 것이었습니다.Test잘못된 패키지에서:

import org.junit.Test;

다음과 같은 것으로 대체하는 것이 저에게는 효과가 있었습니다.

import org.junit.jupiter.api.Test;

컨텍스트에서 Spring beans를 연결하려면 Spring Junit runner를 사용해야 합니다.아래 코드는 다음과 같은 응용 프로그램 컨텍스트가 있다고 가정합니다.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.2Hibernate 3.6.5와 함께 작동합니다.

구성에서 컨텍스트 파일 위치가 누락되면 다음과 같은 문제를 해결할 수 있습니다.

  • 컨텍스트 환경설정에서 컨텍스트 파일 위치 지정

예:

@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 덕분에

SpringJunitRunner를 사용하도록 지시하는 주석을 Junit 클래스에 추가해야 합니다.원하는 것은 다음과 같습니다.

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

이 메시지는 Junit에게 test-context.xml 파일을 test와 동일한 디렉토리에 사용하도록 지시합니다.이 파일은 실제 컨텍스트와 유사해야 합니다.봄에 사용하는 xml이지만 테스트 리소스를 가리키고 있습니다.

언급URL : https://stackoverflow.com/questions/17623694/spring-not-autowiring-in-unit-tests-with-junit

반응형