2014-06-30 27 views
7

Tôi đang sử dụng JUnit 4, Java 8 và Gradle 1,12. Tôi có một tệp với json mặc định mà tôi cần tải. Dự án của tôi có src/main/java/ (chứa nguồn dự án), src/main/resources/ (trống), src/test/java/ (nguồn kiểm tra đơn vị) và src/test/resources/ (thư mục tệp dữ liệu json để tải). Tệp build.gradle nằm trong thư mục gốc.Truy cập Tài nguyên trong Bài kiểm tra Đơn vị

Trong mã của tôi, tôi có:

public class UnitTests extends JerseyTest 
{ 
    @Test 
    public void test1() throws IOException 
    { 
    String json = UnitTests.readResource("/testData.json"); 
    // Do stuff ... 
    } 

    // ... 
    private static String readResource(String resource) throws IOException 
    { 
    // I had these three lines combined, but separated them to find the null. 
    ClassLoader c = UnitTests.class.getClassLoader(); 
    URL r = c.getSystemResource(resource); // This is returning null. ???? 
    //URL r = c.getResource(resource); // This had the same issue. 
    String fileName = r.getFile(); 
    try (BufferedReader reader = new BufferedReader(new FileReader(fileName))) 
    { 
     StringBuffer fileData = new StringBuffer(); 
     char[] buf = new char[1024]; 
     int readCount = 0; 
     while ((readCount = reader.read(buf)) != -1) 
     { 
     String readData = String.valueOf(buf, 0, readCount); 
     fileData.append(readData); 
     } 

     return fileData.toString(); 
    } 
    } 
} 

Từ những gì tôi đọc, mà nên cung cấp cho tôi quyền truy cập vào các tập tin tài nguyên. Tuy nhiên, tôi nhận được một ngoại lệ con trỏ null khi tôi cố gắng sử dụng URL, bởi vì các cuộc gọi getSystemResource() trả về null.

Làm cách nào để truy cập các tệp tài nguyên của tôi?

+0

Bạn có thư mục/src/kiểm tra/nguồn lực trong classpath của bạn? –

+0

Tôi nghi ngờ điều đó. Tôi không tải lớp học mặc dù. – kwiqsilver

Trả lời

12

Tên tài nguyên không bắt đầu bằng dấu gạch chéo, vì vậy bạn sẽ cần phải loại bỏ điều đó. Tài nguyên nên được đọc với UnitTests.getClassLoader().getResourceAsStream("the/resource/name"), hoặc nếu cần File, new File(UnitTests.getClassLoader().getResource("the/resource/name").toURI()).

On Java 8, bạn có thể thử một cái gì đó như:

URI uri = UnitTests.class.getClassLoader().getResource("the/resource/name").toURI(); 
String string = new String(Files.readAllBytes(Paths.get(uri)), CharSet.forName("utf-8")); 
+0

Vấn đề là dấu gạch chéo. Tất cả các ví dụ tôi đọc có dấu gạch chéo hàng đầu vì một lý do nào đó. Đề xuất Java 8 có một số lỗi. Đây là mã chính xác, cho bất kỳ ai sử dụng điều này: 'URI uri = UnitTests.class.getClassLoader(). GetResource (resource) .toURI(); trả về chuỗi mới (Files.readAllBytes (Paths.get (uri)), Charset.forName ("utf-8")); ' – kwiqsilver

+1

Hoặc các ví dụ đã sử dụng' Class # getResource' thay vì 'ClassLoader # getResource' hoặc họ đã sai. Đã sửa lỗi đoạn mã Java 8. –

0

Tôi nghĩ bạn muốn getResource thay vì getSystemResource. Cái sau được sử dụng để, ví dụ, đọc một tập tin từ hệ thống tập tin, nơi mà đường dẫn sẽ không được xác định trong điều khoản của bình.

Bạn cũng có thể bỏ qua bộ nạp lớp: UnitTests.class.getResource("...")

Docs about resources here

Sửa: có một số ý kiến ​​chi tiết hơn trong các câu trả lời here.

+0

Tôi đã sử dụng getResources, nhưng nó tạo ra cùng một lỗi. – kwiqsilver

+0

Sau khi đọc kỹ hơn, tôi nhận ra rằng tôi đã hiểu sai tài liệu getSystemResource. Đối số của nó được xác định theo đường dẫn lớp môi trường hệ thống, không phải là hệ thống tập tin gốc, như tôi đã nghĩ khi tôi viết câu trả lời ở trên. Tôi sẽ để lại câu trả lời ở đây vì lợi ích của các liên kết. –

Các vấn đề liên quan