[SPRING] JUnit을 사용한 유닛 테스트에서 스프링이 자동 와이어 링되지 않음
SPRINGJUnit을 사용한 유닛 테스트에서 스프링이 자동 와이어 링되지 않음
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.루트 유닛 테스트 클래스에 다음과 같이 추가하십시오.
루트 유닛 테스트 클래스에 다음과 같이 추가하십시오.
@RunWith( SpringJUnit4ClassRunner.class ) @ContextConfiguration
이렇게하면 기본 경로에서 XML이 사용됩니다. 기본값이 아닌 경로를 지정해야하는 경우 ContextConfiguration 주석에 locations 속성을 제공 할 수 있습니다.
http://static.springsource.org/spring/docs/2.5.6/reference/testing.html
-
==============================
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.구성에서 컨텍스트 파일 위치가 누락되면이를 해결할 수있는 한 가지 방법이 발생할 수 있습니다.
구성에서 컨텍스트 파일 위치가 누락되면이를 해결할 수있는 한 가지 방법이 발생할 수 있습니다.
처럼:
@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.SpringJunitRunner를 사용하도록 주석을 Junit 클래스에 추가해야한다. 당신이 원하는 것들 :
SpringJunitRunner를 사용하도록 주석을 Junit 클래스에 추가해야한다. 당신이 원하는 것들 :
@ContextConfiguration("/test-context.xml") @RunWith(SpringJUnit4ClassRunner.class)
이렇게하면 Junit은 test-context.xml 파일을 테스트와 동일한 디렉토리에서 사용하게된다. 이 파일은 봄에 사용하는 실제 context.xml과 유사해야하지만 자연스럽게 테스트 자원을 가리키고 있어야합니다.
from https://stackoverflow.com/questions/17623694/spring-not-autowiring-in-unit-tests-with-junit by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring에서 중복되는 스케줄을 방지하는 방법은 무엇입니까? (0) | 2019.01.14 |
---|---|
[SPRING] Spring 3.0.5는 속성으로부터 @Value 주석을 평가하지 않는다. (0) | 2019.01.14 |
[SPRING] '스프링 - 부트 스타터'항아리는 무엇입니까? (0) | 2019.01.14 |
[SPRING] 스프링 부트의 장점 [닫힘] (0) | 2019.01.14 |
[SPRING] Spring Web Service의 START_ARRAY 토큰에서 객체의 인스턴스를 deserialize 할 수 없다. (0) | 2019.01.14 |