2016-07-06 337 views
5

如何使用Mockito爲測試目的模擬枚舉?鑑於這種樣品枚舉:在Java中使用Mockito模擬枚舉

public enum TestEnum { 
YES, 
NO 
} 

,這一次使用枚舉的方法:

public static boolean WorkTheEnum(TestEnum theEnum) { 
switch (theEnum) { 
    case YES: 
    return true; 
    case NO: 
    return false; 
    default: 
    // throws an exception here 
} 
} 

我怎麼能嘲笑枚舉達到開關環路的默認分支? This answer表示Mockito不能嘲笑枚舉,但答案也在一年多以前提供。我可以在同一時間嘲笑枚舉,還是讓我讓分支保持未經測試?其他Mocking框架不能使用。

+0

有這樣的hacky方法:[黑客入侵和修改「最終靜態」字段](http://www.javaspecialists.eu/archive/Issue161.html) – Jesper

+3

枚舉就像靜態類,因此你可以'用mookito把它們剔除。在你的示例中,默認是無法訪問的,所以你不能測試它。 –

+0

爲什麼要測試不可達路徑? – Manu

回答

5

有兩個答案到:

一)你可以把一些PowerMock般的嘲弄框架。我在那裏兩分錢(不是那樣)。 PowerMock打開了痛苦之地的大門,你不想輸入。

b)把接口放在你的枚舉上

認真地;我現在認爲enums只有一個很好的用例。那就是將它們用作提供某種服務的單身人士。然後,我這樣做:

public interface FooService { void foo(); } 
class FooServiceImpl implements FooService { @Override void foo() ... 
enum FooServiceProvider implements FooService { 
    INSTANCE; 
    private final FooService impl = new FooServiceImpl(); 
    @Override foo() { impl.foo() 

當然,當你使用像你這樣的枚舉時,這並沒有什麼幫助。但事情是:不管怎樣,你都不應該使用枚舉。因爲以這種方式使用枚舉導致破碎的代碼 - 每個需要枚舉變量的地方都需要這樣的switch語句;在添加/刪除枚舉情況時會帶來所有負面影響。所以,在你的情況下:考慮轉向真正的OO設計 - 你有抽象基類定義方法;然後使用工廠創建子類(可能基於枚舉開關),這些子類可以爲您提供簡單地做正確事情的對象。