【问题标题】:Why would ServiceUtils.class.getResourceAsStream return null in JUnit?为什么 ServiceUtils.class.getResourceAsStream 在 JUnit 中返回 null?
【发布时间】:2014-06-26 09:35:54
【问题描述】:

同样的语句在我的实际应用程序(网络服务)中工作得很好:

InputStream is = ServiceUtils.class.getResourceAsStream(
  "file:/C:/Users/withheld/workspace/myproj/src/main/webapp/WEB-INF/classes/myproj.properties");

但在 JUnit 测试模块中,它只是不断返回 null。

为什么?

起初,我认为这是一个类路径问题,所以我添加了一个路径,如 here 所述。

但这并没有帮助。

所以,我使用this other SO thread 中描述的方法强制了一个蛮横的绝对路径。

但它仍然返回 null。

我做错了什么?

【问题讨论】:

  • 我怀疑它甚至在您的实际应用程序中也能正常工作。
  • @BheshGurung 为什么?我无法反驳从 myproj.properties 实际读取和使用的结果...请解释一下。
  • 如果您真的确定它可以工作,那么它必须在实际应用程序中使用自定义类加载器。很明显,它与运行测试时使用的类加载器不同。恕我直言,我认为您最好阅读一下有关如何使用类和类加载器通常读取类路径中的资源的信息,然后改用它,因为这将是可移植的。
  • @BheshGurung 我同意。 JUnit 必须使用其他东西,但我不熟悉 JUnit 使用什么。我也尝试了原始的InputStream is = ServiceUtils.class.getResourceAsStream("/myproj.properties");,但结果仍然为空。
  • 看起来好一点。现在您需要确保在执行测试时将该文件所在的文件夹添加到类路径中。例如部署战争时,战争内部的WEB-INF/classes会被服务器自动添加到类路径中。

标签: java junit classpath


【解决方案1】:

我假设您使用的是 maven(基于您项目中的路径)。当您的 Web 应用程序加载时,WEB-INF 下的 classes 目录应该在类路径中,因此请尝试以下操作:

InputStream is = ServiceUtils.class.getResourceAsStream("/myproj.properties");

请注意,这假设您在 src/main/resourcessrc/test/resources 目录中有 myproj.properties(当 maven 构建战争或运行测试时,它会自动复制到 WEB-INF/classes)。

【讨论】:

  • 是的,你的假设是正确的,我使用的是 Maven。而且......为了我的一生,我发誓我尝试了你的"/myproj.properties"(没有成功),但现在,出于某种奇怪的原因,它起作用了!我现在肯定明白为什么它可以工作(在运行时打印类路径之后),但为什么它以前不工作是我无法理解的。感谢 +1 并接受。
  • 我的猜测是你做了getResourceAsStream("myproj.properties")(注意缺少的前导/ 斜线) - 这不起作用。这个错误我已经犯过很多次了!
猜你喜欢
  • 2022-12-26
  • 2011-07-11
  • 1970-01-01
  • 2016-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-25
  • 2015-07-04
相关资源
最近更新 更多