Junit + getResourceAsStream返回Null

bob*_*205 39 java getresource

不确定这是怎么回事.我重读了getResourceAsStream,它总是返回null.

InputStream source = this.getClass().getResourceAsStream("test.xml");
Run Code Online (Sandbox Code Playgroud)

Finder中的test.java旁边(使用OS X和Eclipse)是test.xml

我可以在TextWrangler中打开它,并将其视为存在于内部的数据.

如果它有任何不同,这是一个Junit测试.我去查看我们系统上现有的Junit测试,并且我以与工作示例完全相同的方式使用它(如文件所在的位置和代码本身).

可以防止我假设getClass()返回正确的路径有什么小的差别?

谢谢!

sur*_*ajz 26

它没有在类路径上找到资源.如果您正在使用junit和maven,请确保通过<include><testResource>section 上添加file directive 来将资源复制到target/test-classes 上

您还可以使用在文件系统中找到类的位置

this.getClass().getResource(".")
Run Code Online (Sandbox Code Playgroud)

并检查资源是否存在

  • `的System.out.println(MyClass.class.getResource()的getPath() "");` (7认同)
  • 的System.out.println(this.getClass()getClassLoader()的getResource()的getPath(). ""); (3认同)

Bri*_*new 21

getResourceAsStream()正在使用CLASSPATH,因此它将从您的类的任何地方加载,而不是源文件.

我怀疑你需要将XML复制到与.class文件相同的目录.


gum*_*ins 14

如果您使用的是Maven,请将此部分添加到您的 pom.xml

<build>
    <testResources>
        <testResource>
            <directory>${project.basedir}/src/test/resources</directory>
        </testResource>
    </testResources>
</build>
Run Code Online (Sandbox Code Playgroud)

test.xml和其他资源文件必须位于src/test/resources


Seb*_*iec 11

我总是对这种方法有问题.这里有2个链接,可能很有用:

我总是尝试在开头添加"/"或"./".

根据我的经验,最好的方法是使用FileInputStream.只有一件事要记住(当使用带有Eclipse的FileInputStream时),使用默认设置,您的工作目录将设置为项目根目录.您始终可以使用此代码检查当前目录的位置(以及所需的相对路径).


lim*_*imc 7

假设test.xml位于test根源文件夹的正下方,请执行以下操作: -

InputStream source = this.getClass().getClassLoader().getResourceAsStream("test.xml");
Run Code Online (Sandbox Code Playgroud)


小智 6

尝试使用类加载器

InputStream source = this.getClass().getClassLoader().getResourceAsStream("test.xml");
Run Code Online (Sandbox Code Playgroud)