Junit + getResourceAsStream 返回空值

55

我不确定这是怎么可能的。我重新阅读了getResourceAsStream,它总是返回null。

InputStream source = this.getClass().getResourceAsStream("test.xml");

在Finder中,与test.java紧挨着的是test.xml(使用OS X和Eclipse)。

我可以用TextWrangler打开它,并查看其中的数据。

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

可能存在什么小差异导致我假定getClass()不能返回正确的路径?

15个回答

34

它没有在类路径上找到资源。如果您正在使用junit和maven,请确保通过在<testResource>部分中添加<include>文件指令来将资源复制到target/test-classes。

您还可以通过使用以下方法找出类在文件系统中的位置:

this.getClass().getResource(".")

并检查资源是否存在


11
System.out.println(MyClass.class.getResource(".").getPath()); - jcalfee314
4
System.out.println(this.getClass().getClassLoader().getResource(".").getPath());这段代码的功能是打印当前类的类加载器所加载资源文件的路径。 - pherris
1
是的,这很有帮助!我可以看到编译文件夹在哪里,然后我在命令行中搜索该文件夹以查找我的资源,并相对于它进行加载...谢谢! - Brad Parks

28
如果您使用的是Maven,请将此部分添加到您的 pom.xml 中。
<build>
    <testResources>
        <testResource>
            <directory>${project.basedir}/src/test/resources</directory>
        </testResource>
    </testResources>
</build>

您的test.xml和其他资源文件必须位于src/test/resources目录下。


1
这非常有帮助。谢谢! - Vinayak Ponangi
1
这会将src/main/resources复制到测试文件可以访问的位置吗?这个目录已经是测试资源的默认目录了...所以我不确定为什么需要指定它? - TheJeff

26

getResourceAsStream()使用的是CLASSPATH路径,因此它将从你的类所在位置加载资源,而不是从源文件目录加载。

我猜想你需要将XML文件复制到与.class文件相同的目录中。


13

我经常在使用这个方法时遇到问题,以下是两个链接,可能会有帮助:

我总是试着在开头添加“/”或“./”。

从我的经验来看,最好的方法是使用FileInputStream。只有一件事需要记住(在使用Eclipse时使用FileInputStream),默认设置下,您的工作目录设置为项目根目录。 您可以随时使用此代码片段检查当前目录位置(以及您需要的相对路径)。


第一个链接帮了我。谢谢。 - expert
1
我总是尝试在开头添加“/”或“./”。 - Dhana Krishnasamy

12

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

InputStream source = this.getClass().getClassLoader().getResourceAsStream("test.xml");

5
请尝试使用类加载器。
InputStream source = this.getClass().getClassLoader().getResourceAsStream("test.xml");

在我的情况下,在路径前面添加“classpath:”是至关重要的,因此使用“classpath:/test.xml”。 - isgoed
这只是对这个现有答案的重复吗? - Pang

3

我在这个问题上花费了很多时间,发现缺少以下配置: 右键单击Eclipse项目,选择属性 -> Java Build Path -> Source,编辑Included行并添加*.properties(*.fileExtension)


2
将test.xml放置在src/main/resources(或src/test/resources)中。
File file = ResourceUtils.getFile("classpath:test.xml");
String test = new String(Files.readAllBytes(file.toPath()));

0

尝试使用 MyClass.getResourceAsStream()。

同时,尝试将 test.xml 放在类路径下。例如,在 Eclipse Web 项目中,将 text.xml 放在 webcontent/WEB-INF/classes 中。


0

看起来有很多可能的原因,但我的问题在这里没有找到。我发现我的测试不再被Maven检测/运行,this baeldung post也提供了许多可能的原因。我的问题最终是我在某个时候更改了错误的pom并将我的打包设置为pom

测试编译步骤完全被跳过,没有新资源出现在类路径中。因此,请检查您的target/test-classes目录,并确保您的测试实际上首先正在编译。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接