2010-08-18 4 views
9

새 파일을 저장할 디렉터리로 사용될 Mockito를 사용하여 파일 모의 개체를 만듭니다. 모의 파일 클래스 및 NullPointerException

Folder folder = Mockito.mock(File.class); 
File file = new Agent().createNewFile(folder, "fileName"); 

내 에이전트 클래스 내부

:

public File createNewFile(File folder, String filename){ 
    return new File(folder, "testfile"); 
} 

그러나 createNewFile 방법 안에 새 파일을 만들 때이 파일의 초기화 블록에서 NullPointerException이납니다 :

java.lang.NullPointerException at java.io.File.<init>(File.java:308) 

I File에 빈 생성자가 없기 때문에 발생한다고 생각합니다. 따라서 객체를 조롱 할 때 내부 상태가 null로 유지됩니다.

File folder 개체를 조롱하는 잘못된 접근 방법을 취하고 있습니까? 내 목표는 새 파일을 만들기 전에 몇 가지 제약 조건을 확인하는 것이지만 파일 시스템의 기존 실제 폴더에 의존하고 싶지 않습니다.

감사합니다.

+0

"파일에 빈 생성자가 없기 때문에 발생한다고 생각합니다." 저는 Mockito에 익숙하지 않지만 그럴 가능성이 큽니다. javadoc에 File가 "파일 및 디렉토리 경로 이름의 추상 표현"이라고 명시되어 있으므로 매개 변수 정렬을 사용하는 생성자가 없다는 것은 의미가 있습니다. 따라서 File은 호스트 시스템에서 주어진 파일을 가리킬 필요가 있지만 "물리적으로"그것을 나타내지 않고 단순히 파일 I/O 작업을 수행 할 수 있습니다. http://download.oracle.com/javase/1.4.2/docs/api/java/io/File.html –

답변

8

File 클래스에서 내부적으로 호출 될 때 폴더에 대한 getPath()의 비헤이비어를 정의해야합니다.

File folder = Mockito.mock(File.class); 
when(folder.getPath()).thenReturn("C:\temp\"); 
File file = new Agent().createNewFile(folder, "fileName"); 

그것은 당신이 정말 새 파일을 만들 수 있지만 새 파일을 호출하지 않는 단까지 작동합니다

당신은 그것을 할 수 있습니다.

+0

이 문제가 적어도 나를위한 것이 아니라 File의 코드를 해결한다고 생각하지 않습니다. 파일 parent, String child) 생성자가 path 속성이 null이기 때문에 불면 "if (parent.path.equals (" ")) {"... – Adam

+0

나는 이것이 어떻게 문제를 해결할 것인지 이해하지 못한다. 결국 예제로 게시 한 코드에서 1 행 이상을 얻지 못합니다. nullpointer가 바로 throw됩니다. – Steven

+1

동의 JDK 7u40 이상의 질문에 대한 답변을하지 못합니다. https://bugs.openjdk.java.net/browse/JDK-8003992로 FileInputStream을 수정하여 해당 ctor에서 File.isInvalid()를 호출하고 File.isInvalid())는 File.getPath() 대신 File.path 멤버 변수에 직접 액세스합니다. – jenglert