从UnitTest找不到ClassLoader资源

时间:2017-07-19 14:05:16

标签: java

我有一个读取资源文件的类方法,但是当我尝试使用单元测试运行此类时,无法找到文件。

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

文件位置(不确定是否需要src / test / resources,仅在我遇到问题后添加它,但没有帮助):

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

1 个答案:

答案 0 :(得分: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

中描述