2010-08-18 32 views
9

Tôi đang tạo đối tượng Mô phỏng tập tin bằng Mockito sẽ được sử dụng làm thư mục để lưu trữ một Tệp mới.Lớp Mock File và NullPointerException

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

và bên trong lớp Agent của tôi:

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

Nhưng tôi nhận được một NullPointerException tại khối khởi tạo các tập tin khi tạo file mới bên createNewFile phương pháp:

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

tôi nghĩ rằng nó xảy ra bởi vì File không có bất kỳ hàm tạo rỗng nào, vì vậy khi chế nhạo đối tượng một số trạng thái nội bộ vẫn là null.

Tôi có đang tiếp cận sai khi chế nhạo đối tượng File folder không? Mục tiêu của tôi là kiểm tra một số ràng buộc trước khi tạo tệp mới, nhưng tôi không muốn phụ thuộc vào thư mục thực hiện có trên hệ thống tệp.

Cảm ơn bạn.

+0

"Tôi nghĩ điều đó xảy ra vì Tệp không có bất kỳ hàm tạo trống nào" Tôi không quen với Mockito nhưng rất có thể là trường hợp. Sự vắng mặt của một hàm tạo với các tham số sắp xếp có ý nghĩa khi javadoc nói rằng Tệp là "Một biểu diễn trừu tượng về tên đường dẫn tệp và thư mục". Như vậy, File sẽ cần phải trỏ một tập tin nhất định trên hệ thống máy chủ nhưng không đại diện cho nó "vật lý" và chỉ đơn giản là cho phép thực hiện các hoạt động I/O tập tin. http://download.oracle.com/javase/1.4.2/docs/api/java/io/File.html –

Trả lời

8

Bạn cần xác định hành vi cho getPath() cho thư mục vì nó được gọi nội bộ trong lớp Tệp.

Bạn có thể làm điều đó như:

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

Nó sẽ chỉ làm việc cho đến khi bạn không thực sự tạo ra một tập tin mới, nhưng chỉ gọi tập tin mới.

+0

Tôi không tin điều này giải quyết được vấn đề, ít nhất là không cho tôi, mã trong Tệp (File cha, String con) constructor thổi lên bởi vì các thuộc tính path là null, "if (parent.path.equals (" ")) {" ... – Adam

+0

Tôi cũng không hiểu làm thế nào điều này sẽ giải quyết vấn đề. Sau khi tất cả các bạn không nhận được thêm sau đó dòng 1 trong mã bạn đăng làm ví dụ. Các nullpointer được ném ngay tại đó. – Steven

+1

Đồng ý điều này không trả lời câu hỏi cho JDK 7u40 trở lên do https://bugs.openjdk.java.net/browse/JDK-8003992 đã sửa đổi FileInputStream để gọi File.isInvalid() trong ctor và File.isInvalid () truy cập biến thành viên File.path trực tiếp thay vì File.getPath(). – jenglert