【问题标题】:Junit + getResourceAsStream Returning NullJunit + getResourceAsStream 返回 Null
【发布时间】:2011-07-11 10:00:53
【问题描述】:

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

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

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

我可以在 TextWrangler 中打开它,并将其视为现有数据。

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

我认为 getClass() 无法返回正确的路径会有什么细微差别?

谢谢!

【问题讨论】:

    标签: java getresource


    【解决方案1】:

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

    你也可以通过使用来找出你的类在文件系统中的位置

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

    并检查资源是否存在

    【讨论】:

    • System.out.println(MyClass.class.getResource(".").getPath());
    • System.out.println(this.getClass().getClassLoader().getResource(".").getPath());
    • 是的,这有帮助!我可以看到正在编译东西的文件夹是什么,然后我在命令行上搜索该文件夹以查看我的资源在哪里,并相对于该文件夹加载它......谢谢!
    【解决方案2】:

    getResourceAsStream() 正在使用 CLASSPATH,因此它将从您的类所在的任何位置加载,而不是从您的源文件加载。

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

      • 这很有帮助。谢谢!
      • 这是否会将 src/main/resources 复制到测试文件可以访问它们的位置?这个目录已经是测试资源的默认目录了……所以我不知道为什么需要指定它?
      【解决方案4】:

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

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

      根据我的经验,最好的方法是使用 FileInputStream。只需记住一件事(在 Eclipse 中使用 FileInputStream 时),在默认设置下,您的工作目录设置为项目根目录。您可以随时使用this piece of code 检查当前目录在哪里(以及您需要哪些相对路径)。

      【讨论】:

      • 第一个链接帮助了我。谢谢。
      • Like -> 我总是尝试在开头添加“/”或“./”。
      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

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

          【讨论】:

            【解决方案8】:

            尝试使用类加载器

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

            【讨论】:

            • 在路径前添加classpath: 对我来说至关重要,所以"classpath:/test.xml"
            【解决方案9】:

            试试 MyClass.getResourceAsStream()。

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

            【讨论】:

              【解决方案10】:

              来自 Java API:

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

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

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

              像魅力一样工作!

              【讨论】:

                【解决方案11】:

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

                【讨论】:

                  【解决方案12】:

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

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

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

                  【讨论】:

                    【解决方案13】:

                    我在 Spring 课程中遇到了这个问题。 System.class.getResourceAsStream(...) 在单元测试中工作但不在 Tomcat 中,Thread.currentThread().getContextClassLoader().getResourceAsStream(...) 在 Tomcat 中工作但不在单元测试中。

                    最终我选择了:

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

                    我还发现,一旦我这样做了,我确实不需要需要以斜线开头的路径。

                    【讨论】:

                    • 您从哪里获得 ClassUtils?
                    猜你喜欢
                    • 2015-02-19
                    • 1970-01-01
                    • 2013-10-02
                    • 2013-06-21
                    • 1970-01-01
                    • 1970-01-01
                    • 2014-12-07
                    • 1970-01-01
                    相关资源
                    最近更新 更多