java - Junit 不读取静态字段
问题描述
我有这个静态字段的类
public class Parameters {
public Parameters()
{
}
public static Image img = new Image(new File("myImage.png").toURI().toString());
}
和junit类
import Parameters.*;
@Test
void test() {
Image img = Parameters.img; //error here
}
问题是当我调试Parameters.img为null时,我得到错误java.lang.ExceptionInInitializerError,我不知道如何修复它,从测试中读取该图像
还要提到 Image 类来自 javafx。
解决方案
这种代码风格不是一个好主意。
您的Parameters 类包括静态初始化——任何时候只要看到Parameters 的一般方向的任何代码,JVM 就会意识到Parameters 尚未加载,因此JVM 会出去并加载它;作为该工作的一部分,代码new Image(new File("myImage.png").toURI().toString())
运行,并引发异常。
由于多种原因,初始化程序中的异常令人讨厌,因此得出结论:不要将可能会出错的代码放入初始化程序。
一个更好的策略是创建一个方法:
private static Image getMyImage() {
return new Image(...);
}
或者可能涉及某种缓存(第一次加载它,以后只返回缓存的对象)。现在,异常在“正常程序流程期间”被抛出(作为调用方法的一部分,而不是作为加载类的一部分)。
更一般地说,这个概念根本不适用于 File,您不希望图像作为单独的文件,它们是资源并且应该在您的类文件所在的同一位置,即使(尤其是!)如果您的类文件在一个jar文件。这涉及:new Image(Parameters.class.getResource("myImage.png"))
. 这告诉 JVM 查看 Parameters.class 所在的位置。
此代码仍应位于方法中,而不是像这样的静态字段 init 中。
推荐阅读
- python - 使用 pandas 中所有先前的值进行计算
- node.js - 是否可以在线使用 Github 页面将 nodejs 构建为静态?
- elasticsearch - Logstash 问题正在运行
- java - 一次使用 QueryExecutionFactory 执行多个 Sparql 查询
- sass - 在 SCSS 中使用 HSLA 中的 CSS 变量
- javascript - 使用 Yup 验证多个输入字段
- verilog - 在以下情况下应该输出什么?
- web - 编程语言的选择是否会影响对 DoS 的保护,特别是 Ping Flood?
- selenium-webdriver - 我想验证一个没有正文的弹出窗口,我无法找到它的窗口句柄
- android - 检查 Wifi 连接时,广播接收器未捕获所需的情况