2017-07-19 3 views
0

Ich habe eine Klassenmethode, die Ressource-Datei liest, aber Datei kann nicht gefunden werden, wenn ich versuche, diese Klasse mit Komponententests auszuführen.ClassLoader Resource nicht gefunden von UnitTest

Wenn ich Application War bereitstellen oder einfach aus Eclipse mit Maven ausführen, funktioniert alles gut.

Datei-Stellen (nicht sicher, ob src/test/Ressourcen benötigt werden, hinzugefügt, um es erst, nachdem ich das Problem gestoßen, hätte aber nicht helfen):

src/main/resources/ 
    -> com 
     -> xxxx 
      -> xxxx_portal 
       -> web 
        -> server 
         -> servlet 
          -> reports -> Logo.png 
src/test/resources/ 
    -> com 
     -> xxxx 
      -> xxxx_portal 
       -> web 
        -> server 
         -> servlet 
          -> reports -> Logo.png 

Relevante Klassencode:

package com.xxxx.xxxx_portal.web.server.servlet.reports; 

public class ModuleReports { 
    private static final String LOGO_IMAGE_PATH = "/com/xxxx/xxxx_portal/web/server/servlet/reports/Logo.png"; 

    ... 
    private static InputStream getLogoImage() { 
     ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); 
     InputStream is = classLoader.getResourceAsStream(LOGO_IMAGE_PATH); //Problem here, InputStream is null. It should not be null. 
     return is; 
    } 
    ... 
} 

Antwort

0

Das Argument für ClassLoader.getResourceAsStream darf nicht mit einem Schrägstrich beginnen (/). Während Sie nur den Anfangsstrich aus dem Wert von ACDLABS_LOGO_IMAGE_PATH entfernen könnte, sollten Sie Class.getResourceAsStream verwenden, anstatt ClassLoader.getResourceAsStream:

private static InputStream getLogoImage() { 
    return ModuleReports.class.getResourceAsStream("ACDLogo.png"); 
} 

Im Gegensatz zu ClassLoader.getResourceAsStream, um das Argument kann mit einem Class.getResourceAsStream starten Schrägstrich, muss aber nicht. Ist dies nicht der Fall, wird angenommen, dass die Zeichenfolge auf eine Ressource im selben Paket verweist wie die Klasse, auf der sie aufgerufen wird. All dieses Verhalten ist in the documentation beschrieben.

+0

Ich hatte gehofft, diese Klasse und ihre Methoden wenn möglich nicht zu berühren. Wollen Sie sagen, dass das Entfernen eines Schrägstrichs den Komponententest funktioniert? Wie bereits erwähnt, funktioniert Class ModuleReports gut mit einem Schrägstrich, wenn es nicht von Komponententests ausgeführt wird. – CrazySabbath

+0

Es ist einen Versuch wert. Vielleicht möchten Sie auch Ihre Frage aktualisieren und zeigen, wie Ihre Anwendung erstellt wird; Das heißt, zeigen Sie die Maven pom.xml oder die Ant build.xml. – VGR

+0

Entfernen von Schrägstrich funktioniert. Obwohl dies ein merkwürdiges Verhalten ist, funktioniert die bereitgestellte Anwendung in jeder Hinsicht (mit oder ohne Schrägstrich), während der Komponententest nur funktioniert, wenn der Start-Schrägstrich entfernt wird. – CrazySabbath