首页 > 解决方案 > 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。

标签: javajavafxjunit

解决方案


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

您的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 中。


推荐阅读