2014-06-30 30 views
7

JUnit 4, Java 8 ve Gradle 1.12 kullanıyorum. Yüklemem gereken varsayılan jsonlu bir dosyam var. Projem src/main/java/ (proje kaynağını içeren), src/main/resources/ (boş), src/test/java/ (birim sınama kaynağı) ve src/test/resources/ (yükleme yapılacak json veri dosyası) dizinlerine sahiptir. build.gradle dosyasının köküdür. Benim kodBirim Testlerindeki Erişim Kaynakları

Ben: Okuduğum kadarıyla

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(); 
    } 
    } 
} 

, bu bana kaynak dosyasına erişimi vermelidir. Ancak, URL'yi kullanmaya çalıştığımda boş bir işaretçi istisnası alıyorum çünkü getSystemResource() çağrısı null döndürüyor.

Kaynak dosyalarına nasıl erişirim?

+0

Eğer sınıf yolunda/src/test/kaynaklar klasörünü var mı? –

+0

Bundan şüpheliyim. Yine de sınıfları yüklemiyorum. – kwiqsilver

cevap

12

Kaynak adları bir eğik çizgi ile başlamıyor, bundan kurtulmanız gerekiyor. Kaynak, tercihen UnitTests.getClassLoader().getResourceAsStream("the/resource/name") ile veya File gerekli ise new File(UnitTests.getClassLoader().getResource("the/resource/name").toURI()) ile okunmalıdır. Java 8 günü

, gibi bir şey deneyebilirsiniz:

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

Sorun, eğikti. Okuduğum tüm örnekler, bir sebepten ötürü büyük bir eğime sahipti. Java 8 önerisinde bazı hatalar var. Bunu kullanan herkes için doğru kod: 'URI uri = UnitTests.class.getClassLoader(). GetResource (resource) .toURI(); new String (Files.readAllBytes (Paths.get (uri)), Charset.forName ("utf-8")); – kwiqsilver

+1

döndürdü. Örnekler, 'ClassLoader # getResource' yerine' Class # getResource' kullanıyordu veya yanılıyorlardı. Java 8 kod pasajı düzeltildi. –

0

Ben getSystemResource yerine getResource istediğinizi düşünüyorum. İkincisi, örneğin, dosya sisteminin, yolun jar cinsinden belirtilemeyeceği bir dosyadan okunması için kullanılır.

Ayrıca sınıf yükleyici atlayabilirsiniz: UnitTests.class.getResource("...")

Docs about resources here

Düzenleme: cevaplar here biraz daha ayrıntılı yorumlar yer alıyor.

+0

getResources kullanıyordum, ancak aynı hatayı veriyor. – kwiqsilver

+0

Daha dikkatli bir şekilde okuduktan sonra, getSystemResource belgelerini yanlış anlamış olduğumu farkettim. Onun argümanı, yukarıdaki cevabı yazdığımda düşündüğüm gibi, sistem ortamının sınıf yolu açısından dosya sistemi kökünden değil. Bağlantıları uğruna cevabı burada bırakacağım. –