Junit 不读取静态字段

Junit doesn't read static field

我有这个 class 和这个静态字段

public class Parameters {

    public Parameters()
    {   
    }
    
    public static Image img = new Image(new File("myImage.png").toURI().toString());

}

和 junit class

import Parameters.*;

@Test
    void test() {
    Image img = Parameters.img; //error here 

}

问题是,当我调试 Parameters.img 为 null 时,出现错误 java.lang.ExceptionInInitializerError, 我不知道如何修复它,从测试中读取该图像

还要提到图像 class 来自 javafx。

这种代码风格不是个好主意。

您的参数 class 包括静态初始化 - 任何时候任何代码只要在参数的一般方向上看,JVM 就会意识到参数尚未加载,因此 JVM 会退出并加载它;作为该作业的一部分,代码 new Image(new File("myImage.png").toURI().toString()) 运行,并抛出异常。

由于多种原因,初始化器中的异常令人讨厌,因此得出结论:不要将可能出错的代码放入初始化器中。

更好的策略是创建一个方法:

private static Image getMyImage() {
    return new Image(...);
}

或者可能涉及某种缓存(第一次加载它,以后只 return 缓存的对象)。现在抛出异常 'during normal program flow'(作为调用方法的一部分,而不是作为加载 class 的一部分)。

更一般地说,这个概念根本不适用于文件,您不希望图像作为单独的文件,它们是资源,应该与您的 class 文件位于同一位置,甚至 (特别是!)如果您的 class 文件在 jar 文件中。这涉及:new Image(Parameters.class.getResource("myImage.png"))。这告诉 JVM 查找 Parameters.class 所在的相同位置。

这段代码应该仍然在方法中,而不是像这样在静态字段初始化中。