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.2 및 Hibernate 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
'programing' 카테고리의 다른 글
| Springfox Swagger에서 제공하는 Swagger /v2/api-docs에서 CORS 헤더를 활성화하려면 어떻게 해야 합니까? (0) | 2023.08.13 |
|---|---|
| PowerShell에서 문자열을 변수와 연결하려면 어떻게 해야 합니까? (0) | 2023.08.13 |
| Next.js에서 Redx를 사용하는 것은 안티패턴입니까? (0) | 2023.03.26 |
| '@Bean' 메서드에서 '@ConfigurationProperties' 주석 사용 (0) | 2023.03.26 |
| Angular 구성 파일JS (0) | 2023.03.26 |