繁体   English   中英

通过系统属性的静态最终字段进行单元测试

[英]Unit testing with a static final field from system properties

我有一个带有公共静态最终字段的接口,该字段从系统属性中提取。 看起来像这样:

public interface MyInterface {
    public static final String MYFIELD = System.getProperty("MyField");
    ...
}

我正在编写使用此字段的单元测试。 即使在测试之前在静态初始化程序中设置了系统属性,接口字段也将返回null

System.out.println(System.getProperty("MYField")); //returns "MyField"
System.out.println(MyInterface.MYFIELD); //returns null

为什么未设置接口字段? 处理这种情况的最佳方法是什么? 我不能只在测试中设置字段值,因为它是最终静态的。

更新:

我可能错过了一个重要的细节; 我正在使用Mocktio。 看起来像这样

public class MyTest {

    static {System.setProperty("MyField", "MyValue");}

    @Test
    public void test1() {
        try {
            final MyInterface mockInterface = Mockito.mock(MyInterface.class);
            ...
        }
     }
}

对您来说是个坏消息:由于静态, MYFIELD字段在加载MyInterface进行评估。 因此,如果您的测试类具有对MyInterface静态引用,则它将与您的测试类同时加载。 因此,在执行测试之前,您别无选择通过代码设置System属性。

我怀疑您使用的是好方法:通常,接口应该代表一种行为 ,而不仅仅是一堆任意常量。 但是,如果您确实需要在接口的成员中存储一些常量值,则从Sytem属性中获取这些值是没有意义的:常量旨在精确地是常量

如果您需要程序依赖于任意值,则应将它们作为输入参数 (在构造函数或方法中)接收,以使您有机会在进行测试时根据自己的意愿设置它们的值。 这种重构将花费开发时间,但是您的代码将变得更加干净和安全。

相反,如果您拒绝重构代码,则可以“按原样”运行测试的唯一方法是在调用JVM时设置系统属性值:

java -DMyField=... foo.bar.MyTest

在类加载时初始化的静态字段。 JVM加载类,然后设置系统属性,但是类已经加载,并且静态字段初始化为null,因为在类加载时属性为空...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM