Java 重构静态类以便对其进行单元测试

Java 重构静态类以便对其进行单元测试,java,Java,我有一个静态类,我想重构它,这样我可以更改属性文件的名称等,并且可以更容易地进行单元测试 目前我有: public enum MySettings { INSTANCE; //priv vars private string applicationUrl; private MySettings() { MappingJsonFactory jf = new MappingJsonFactory(); ClassLoader classLoade

我有一个静态类,我想重构它,这样我可以更改属性文件的名称等,并且可以更容易地进行单元测试

目前我有:

public enum MySettings {

   INSTANCE;

   //priv vars
   private string applicationUrl;

   private MySettings() {

     MappingJsonFactory jf = new MappingJsonFactory();

    ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
    InputStream mySettingsInputStream = classLoader.getResourceAsStream("a.properties");

    Properties mySettingsProperties = new Properties().load(mySettingsInputStream);

    // code below to load json and set priv vars etc.




   }

   public String getApplicationUrl() {
       return applicationUrl;
   }
}
在单元测试中,如何将属性文件的名称设置为其他名称?

“控制反转”。最简单的方法是将其作为构造函数参数。更高端的是国际奥委会的框架,如Spring

更糟糕的情况是,因为您正在处理一个
枚举
——可能需要考虑一个接口,然后提供一个实现的枚举。或者更好:

public enum Settings {
    PRODUCTION("prod.xml"), UNIT_TESTING("dev.xml");
    //...
“控制反转。”最简单的方法是将其作为构造函数arg。更高端的是国际奥委会的框架,如Spring

更糟糕的情况是,因为您正在处理一个
枚举
——可能需要考虑一个接口,然后提供一个实现的枚举。或者更好:

public enum Settings {
    PRODUCTION("prod.xml"), UNIT_TESTING("dev.xml");
    //...

您可以将enum类中的所有内容整理成一个真正的可实例化类(通过包保护或受保护),然后通过enum(getter)访问它的实例。像这样,你可以像一个符咒一样对所有东西进行单元测试,也可以将它作为一个单体:)。这样就不需要第二个枚举常量(如注释中所指出的)

如果您使用的是protected而不是package protection,则可以通过创建一个从实际类继承的虚拟类来对其进行单元测试,并在测试中对其进行实例化,如下所示:

private static class Dummy extends NewClass {

    public Dummy() {
        super();
    }

}

您可以将enum类中的所有内容整理成一个真正的可实例化类(通过包保护或受保护),然后通过enum(getter)访问它的实例。像这样,你可以像一个符咒一样对所有东西进行单元测试,也可以将它作为一个单体:)。这样就不需要第二个枚举常量(如注释中所指出的)

如果您使用的是protected而不是package protection,则可以通过创建一个从实际类继承的虚拟类来对其进行单元测试,并在测试中对其进行实例化,如下所示:

private static class Dummy extends NewClass {

    public Dummy() {
        super();
    }

}


将其作为构造函数arg传递?也许可以使用setter访问它。或者将其保存在常量类中的a.properties部分。@OliCharlesworth是否将参数传递给枚举构造函数?不…@MattBall:是的,我没注意到这是一个枚举。但是,很明显,如果OP希望它是非静态的,他需要使用一个实际的类…将它作为构造函数arg传递进来?也许可以使用setter访问它。或者将其保存在常量类中的a.properties部分。@OliCharlesworth是否将参数传递给枚举构造函数?不…@MattBall:是的,我没注意到这是一个枚举。但是,很明显,如果OP希望它是非静态的,他将需要使用一个实际的类……在枚举中使用第二个版本的想法非常巧妙:P.简单,但功能强大。@MartinBraun:嗯,也许吧。单元测试的一个关键原则是在要测试的代码中没有特殊的“if_test_mode”钩子。。。(我想这就是第二个想法的含义)@OliCharlesworth请看我的答案。谢谢,实际上我可以创建一个空构造函数,然后创建一个带参数的构造函数,然后进行链接,这样我就不必修改所有其他引用了。谢谢。@OliCharlesworth,很可能会分解出一个接口;通过单独构造枚举,这是非常健康的,因为不同的是数据驱动的(而且OP听起来很有必要,我的意思是,单元测试不应该针对isntance影响生产DBs)。在枚举中使用第二个版本的想法非常巧妙:P.简单,但功能强大。@MartinBraun:Hmm,也许吧。单元测试的一个关键原则是在要测试的代码中没有特殊的“if_test_mode”钩子。。。(我想这就是第二个想法的含义)@OliCharlesworth请看我的答案。谢谢,实际上我可以创建一个空构造函数,然后创建一个带参数的构造函数,然后进行链接,这样我就不必修改所有其他引用了。谢谢。@OliCharlesworth,很可能会分解出一个接口;通过单独构造枚举,这是非常健康的,因为不同的是数据驱动的(而且OP听起来很有必要,我的意思是,单元测试不应该影响iNtance的生产数据库)。