2013-03-10 80 views
0

我有一個靜態類,我想重構,所以我可以更改屬性文件的名稱等,並能夠更容易地單元測試。重構靜態類,所以我可以單元測試它

現在我有這樣的:

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; 
    } 
} 

我怎麼能設置的屬性文件的名稱到別的在我的單元測試的東西嗎?

+0

通過它在作爲構造ARG? – 2013-03-10 16:23:44

+0

也許可以使用setter訪問。 或將其保存在常量類中的a.properties部分。 – 2013-03-10 16:24:33

+1

@OliCharlesworth將參數傳遞給枚舉器?沒有... – 2013-03-10 16:24:38

回答

3

「控制反轉」。最簡單的方法是將它作爲構造函數arg來使用。更高端的是IOC框架,比如Spring。

更糟糕的情況,因爲你正在處理enum - 可能需要分解一個接口,然後提供一個實現枚舉。或者更好:

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

關於在這裏使用接口的好處。 – 2013-03-10 16:25:32

+0

在枚舉中使用第二個版本的想法非常巧妙:P。簡單而強大。 – 2013-03-10 16:26:53

+0

@MartinBraun:嗯,也許吧。單元測試的關鍵原則之一是不要在要測試的代碼中使用特殊的「if_test_mode」鉤子...(我認爲這是第二個想法等同的意思) – 2013-03-10 16:37:43

0

你可以擺弄所有從枚舉類的東西,成爲一個真正的實例化類(通過包保護或保護),然後作出它的一個實例通過枚舉(吸氣)訪問。像這樣,你可以單元測試所有的東西,像魅力一樣,也可以把它當作單身人士:)。有了這個,你不需要第二個枚舉常量(如評論中指出的那樣)。

如果您使用的是保護而不是包裝保護,可以通過創建一個從實際的類繼承,並在這樣的測試實例化該虛擬類單元測試:

private static class Dummy extends NewClass { 

    public Dummy() { 
     super(); 
    } 

}