【问题标题】:ClassLoader sometimes fails to load resourceClassLoader 有时无法加载资源
【发布时间】:2013-11-12 09:34:34
【问题描述】:

对于单元测试类中的 2 个测试,我需要一个报告文件。我尝试按如下方式加载它:

private File getTestFile() {
        try {
            return new File(URLDecoder.decode(ClassLoader.class.getResource("/reports/report.xlsx")
                .getPath(), "UTF-8"));
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return null;
    }

当我第一次运行这些测试时,会发生以下情况:

  • 第一次测试:类加载器找到资源并返回文件,测试通过。
  • 第二次测试:类加载器没有找到资源返回null,测试失败。

在此之后,两个测试都继续失败,直到我重建项目,然后第一个测试通过,第二个测试再次失败。

report.xlsx 位于src/test/resources/reports/reports.xlsx

我做错了什么或解释了这种行为吗?

【问题讨论】:

    标签: java eclipse unit-testing maven classloader


    【解决方案1】:

    我不能 100% 确定这是否是您的问题的原因,但您使用 ClassLoader.class.getResource(...) 加载资源似乎很奇怪。这将在系统类路径中查找资源。相反,您应该使用getClass().getResource(...)getClass().getClassLoader().getResource(...)

    另一个原因:您的测试代码在某处删除了该文件。这解释了为什么第二个测试无法再找到它,以及为什么当您再次运行测试时第一个测试也失败了。 但是由于像 Eclipse 这样的 IDE 在构建项目时总是将所有资源文件从 src 复制到 bin 目录,因此每次重建项目时都会恢复该文件。这就是为什么第一个测试可以在重建后加载一次文件。

    【讨论】:

    • 我尝试了这两种解决方案,但都没有帮助我,我只是得到相同的结果。
    • @Tom 那么也许你的问题出在其他地方。您的代码是否有可能在某处删除了该文件?
    • 确实,在我的代码中我删除了文件(因为它是临时的,所以我从数据库中获取)。从来没有想过它还会删除我的原始(测试)文件。谢谢!
    • 不客气。我已更改答案以反映您问题的真正原因。
    猜你喜欢
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 2023-03-09
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 2019-07-13
    相关资源
    最近更新 更多