2012-07-11 2 views
4

FileInputStream이 닫혀 있는지 확인하는 JUnit 테스트를 작성하려면 어떻게해야합니까? 내가 지금 어떻게하고 싶습니다,이 코드 예제 훨씬 이해가되지 않지만FileInputStream이 닫혀 있는지 테스트하는 방법은 무엇입니까?

@Test 
public void test() { 
    FileInputStreamDemo.main("file.txt"); 
    // test here, if input stream to file is closed correctly 
} 

:

다음 코드를 고려,

import java.io.FileInputStream; 

class FileInputStreamDemo { 

    public static void main(String args[]) throws Exception { 
    FileInputStream fis = new FileInputStream(args[0]); 

    // Read and display data 
    int i; 
    while ((i = fis.read()) != -1) { 
     System.out.println(i); 
    } 

    fis.close(); 

    } 
} 

는이 같은 테스트를 작성하고 싶습니다 FIS가 닫혔는지 확인하는 JUnit 테스트를 작성합니다. (가능한 경우 : 원본 FIS 개체에 대한 참조가없는 경우)

답변

3

파일을 읽는 작업을 수행하는 MyFileReader라는 개별 클래스를 만들어야합니다. 그런 다음 새 클래스를 인스턴스화하고 클래스의 메소드를 호출하여 올바르게 작동하는지 테스트하는 MyFileReaderTest 클래스를 작성합니다. fis를 MyFileReader 클래스의 보호 된 멤버로 만들면 테스트에서 fis에 액세스하여 닫혀 있는지 확인할 수 있습니다.

FileInputStream을 사용하는 대신 InputStream과 같은 인터페이스를 사용해야 만 실제로 파일을 만들지 않지만 close()가 호출되었는지 여부를 추적 할 수있는 MockInputStream을 만들 수 있습니다. 그런 다음 테스트 코드에서 테스트 할 수 있습니다.

+0

실제로 멋진 솔루션입니다. 관심있는 방법으로 두 개의 파일 이름에서 두 개의 FIS를 만들면 어떻게 할 수 있습니까? 첫 번째 FIS가 올바르게 닫힌 경우, 두 번째가 생성시 예외를 throw 할 때 테스트하는 방법? –

+0

먼저 MockInputStream은 가끔 예외를 throw 할 수 있어야합니다. 당신은 테스트에서 그것을 제어하고 예외를 던질 수있는 속성을 설정합니다. mock 객체에서 정적 변수를 사용하여 인스턴스화를 시도 할 때 예외를 throw하도록 지시 할 수 있습니다. 더 좋은 방법은 같은 일을 할 수있는 공장을 이용하는 것입니다. 그런 다음 예외를 항상 throw하는 모의 팩토리에 대한 테스트에서 팩토리를 변경할 수 있습니다. –

관련 문제