2017-07-19 59 views
0

我有一个读取资源文件的类方法,但是当我试图用单元测试运行这个类时,找不到文件。找不到来自UnitTest的ClassLoader资源

如果我要部署应用程序战争或只是使用maven从eclipse运行它,一切正常。

文件位置(不知道是否需要的src /测试/资源,增加它后,才遇到的问题,但并没有帮助):

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 

相关类代码:

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; 
    } 
    ... 
} 

回答

0

ClassLoader.getResourceAsStream的参数不能以斜杠开头(/)。虽然你可以只从ACDLABS_LOGO_IMAGE_PATH的值删除初始斜线,你应该使用Class.getResourceAsStream而不是ClassLoader.getResourceAsStream:

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

不像ClassLoader.getResourceAsStream,该参数Class.getResourceAsStream 可以先从斜线,但不需要。如果没有,则假定该字符串指向与其被调用的类相同的包中的资源。所有这些行为在the documentation中描述。

+0

如果可能的话,我希望不要碰这个类及其方法。你是否说删除斜杠将使单元测试工作?正如我所说的,Class ModuleReports在没有从单元测试运行时可以正常工作。 – CrazySabbath

+0

值得一试。您可能还想更新您的问题并显示您的应用程序的构建方式;也就是说,显示Maven pom.xml或Ant build.xml。 – VGR

+0

删除斜杠工程。虽然这是一个奇怪的行为,因为部署的应用程序工作正常(无论是否启动斜线),而单元测试仅在删除开始斜线时才起作用。 – CrazySabbath