Junit + getResourceAsStream返回Null

时间:2011-03-08 20:37:29

标签: java getresource

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

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

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

我可以在TextWrangler中打开它,并将其视为已存在的数据。

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

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

谢谢!

13 个答案:

答案 0 :(得分:27)

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

您还可以使用

在文件系统中找到课程的位置
this.getClass().getResource(".")

并检查资源是否存在

答案 1 :(得分:22)

getResourceAsStream()正在使用CLASSPATH,因此它将从加载,而不是源文件。

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

答案 2 :(得分:12)

我总是遇到这种方法的问题。这里有2个链接,可能很有用:

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

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

答案 3 :(得分:11)

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

<build>
    <testResources>
        <testResource>
            <directory>${project.basedir}/src/test/resources</directory>
        </testResource>
    </testResources>
</build>

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

答案 4 :(得分:8)

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

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

答案 5 :(得分:1)

尝试MyClass.getResourceAsStream()。

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

答案 6 :(得分:1)

来自Java API:

http://docs.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html#getSystemResource(java.lang.String)

从用于加载类的搜索路径中查找指定名称的资源。此方法通过系统类加载器

定位资源

所以语法例如是: ClassLoader.getSystemResource( “的test.xml”)的toString();

像魅力一样!

答案 7 :(得分:1)

我花了很多时间在这个问题上,它错过了以下配置: 右键单击eclipse项目并选择属性 - &gt; Java构建路径 - &gt;来源并修改包含行和添加* .properties (* .fileExtension)

答案 8 :(得分:0)

我有一个Spring类的问题。 System.class.getResourceAsStream(...)在单元测试中工作但在Tomcat中没有工作,Thread.currentThread().getContextClassLoader().getResourceAsStream(...)在Tomcat中工作但在单元测试中没有工作。

我不知不觉地去了:

ClassUtils.getDefaultClassLoader()
    .getResourceAsStream("com/example/mail/templates/invoice-past-due.html"))

我还发现,一旦我这样做,我做需要让路径以斜线开头。

答案 9 :(得分:0)

您需要将资源文件的副本放入测试资源,在我的示例中,它是字体文件:

enter image description here

然后从你的jUnit测试中调用next:

 public static InputStream getFontAsStream() throws IOException {
        return Thread.currentThread().getContextClassLoader()
                    .getResourceAsStream("fonts/" + "FreeSans.ttf");
    }

答案 10 :(得分:0)

将test.xml放入src / main / resources(或src / test / resources)中。

File file = ResourceUtils.getFile("classpath:test.xml");
String test = new String(Files.readAllBytes(file.toPath()));

答案 11 :(得分:0)

尝试使用类加载器

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

答案 12 :(得分:-1)

将您拥有资源文件的文件夹添加到eclipse的源文件夹中。然后该文件应自动放入bin目录。