Java 在UnitTest中找不到ClassLoader资源

Java 在UnitTest中找不到ClassLoader资源,java,Java,我有一个读取资源文件的类方法,但当我试图用单元测试运行这个类时,找不到该文件 如果我要部署应用程序war,或者只是使用maven从eclipse运行它,那么一切都很好 文件位置(不确定是否需要src/test/resources,仅在遇到问题后才添加,但没有帮助): 相关类别代码: package com.xxxx.xxxx_portal.web.server.servlet.reports; public class ModuleReports { private static fi

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

如果我要部署应用程序war,或者只是使用maven从eclipse运行它,那么一切都很好

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

相关类别代码:

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

ClassLoader.getResourceAsStream的参数不能以斜杠(
/
)开头。虽然可以从ACDLABS\u LOGO\u IMAGE\u PATH的值中删除初始斜杠,但应使用Class.getResourceAsStream而不是ClassLoader.getResourceAsStream:

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

与ClassLoader.getResourceAsStream不同,Class.getResourceAsStream的参数可以以斜杠开头,但不需要以斜杠开头。如果没有,则假定字符串指向调用它的类所在的包中的资源。所有这些行为都在中进行了描述。

我希望尽可能不涉及此类及其方法。你是说删除斜杠会使单元测试工作吗?因为正如我所说的,当不从单元测试运行时,类ModuleReports可以很好地使用斜杠。值得一试。您可能还想更新您的问题,并展示您的应用程序是如何构建的;也就是说,展示Maven pom.xml或Ant build.xml.xml的工作原理。尽管这是一种奇怪的行为,但由于部署的应用程序无论采用哪种方式(带或不带起始斜杠)都可以正常工作,而单元测试只有在删除起始斜杠的情况下才能正常工作。面向对象API的本质是,如果满足文档中指定的条件,方法调用就可以保证正常工作。如果您不这样做,它可能会工作,也可能不会工作,但它工作的条件可能会随着版本或环境的变化而变化。
private static InputStream getLogoImage() {
    return ModuleReports.class.getResourceAsStream("ACDLogo.png");
}