2012-08-02 3 views
2

스프링 3.0과 jUnit 4.8에서 작업 중이며 일부 단위 테스트를 개발하려고합니다.테스트 사례를 실행할 때 스프링 의존성 삽입 null이 발생했습니다.

사실 junit에서 사용하는 응용 프로그램 컨텍스트에로드 된 XML에 정의 된 테스트 케이스에서 종속성 삽입을 사용하여 bean의 특성 (파일)을 설정하려고합니다.

jUnit 4 aproach에 대한 주석을 사용하여로드 된 XML 파일 구성을 사용하고 있습니다. 이것은 모든 테스트 클래스가 사용하는 주요 BaseTest입니다 :

@ContextConfiguration("/test-context.xml") 
@RunWith(SpringJUnit4ClassRunner.class) 
@Ignore 
public class BaseTest { ... } 

그리고 이것은 test-context.xml

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

<bean id="ExtractorTest" class="com.test.service.ExtractorTest"> 
    <property name="file" value="classpath:xls/SimpleFile.xls"></property> 
</bean> 

의 한 부분입니다 그래서 제가 테스트와 내 수업에서 할 (ExtractorTest)을 시도하고있다 클래스 패스 내에로드 된 파일로 'file'속성 만 설정됩니다.

public class ExtractorTest extends BaseTest { 

    private Resource file; 
    private InputStream is; 

    public void setFile(Resource file) { 
     this.file = file; 
    } 

    @Before 
    public void init() { 
     this.is = this.getClass().getResourceAsStream("/xls/SimpleFile.xls"); 
     Assert.assertNotNull(is); 
    } 

    @Test 
    public void testLoadExcel() throws IOException { 
     // file is always null, but the InputStream (is) isn't! 
     Assert.assertNotNull(file.getFile()); 
     InputStream is = new FileInputStream(file.getFile()); 
     HSSFWorkbook wb = new HSSFWorkbook(new POIFSFileSystem(is)); 
     // todo... 
    } 

}

문제는 내가 중단 점을 추가 한 봄이 설정되어 있기 때문에 세터 작품, 그것은 재산 괜찮아요이다 : 여기

테스트와 클래스의 섹션입니다. 하지만 테스트 메소드가 시작될 때 null이고 실행중인 다른 인스턴스이기 때문에 그 이유는 무엇일까요? 테스트를 위해 응용 프로그램 컨텍스트의 XML을 사용하여로드 할 '파일'을 어떻게 설정할 수 있습니까? jUnit을 사용하여 할당 할 수 없으며 이유와 방법을 이해할 수 없습니다. @Before 메서드로 글쓰기를 피하려고 합니다만, 좋은 접근법이라는 것을 잘 모르겠습니다 ...

고맙습니다.

PD : 죄송합니다에 대한 내 ;-) 영어

답변

3

봄이 JUnit을 사용 ExtractorTest의 인스턴스를 생성하지 않기 때문에 귀하의 구성이 작동하지 않습니다; 인스턴스는 JUnit에 의해 생성 된 후 사후 처리를 위해 Spring으로 전달됩니다.

응용 프로그램 컨텍스트에서 ID가 ExtractorTest 인 Bean을 작성하지만 아무도 그 응용 프로그램을 사용하지 않기 때문에 표시되는 효과가 있습니다.

는 의사 코드 : 봄이를 주입하자 다음

<bean id="file" class="..." /> 

(방법 Resource 빈을 구축하는 설명서를 참조) :

ApplicationContect appContext = new ... 
appContext.defineBean("ExtractorTest", new ExtractorTest()); // Calls setter 

ExtractorTest test = new ExtractorTest(); // Doesn't call setter 
test.postProcess(appContext); // inject beans from appContext -> does nothing in your case 

그래서 해결책은 빈 file을 정의하는 것입니다

@Autowired 
private Resource file; 
+0

감사합니다. 아론! 그것은 정확히 당신이 말하는 것과 같습니다. Spring과 jUnit에서 테스트 파일을 사용하는 것이 가장 좋은 방법인지는 모르겠지만, 정의 할 새 bean을 많이 사용하고 있지만 (사용하려는 모든 테스트 파일에 대해 1 개) 작동합니다. @Before 메서드에서 할당하는 것이 더 좋은 아이디어 일 수 있습니다 ... 어쨌든, 다시 한번 감사드립니다! –

관련 문제