2016-07-06 67 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设计 - 你有抽象基类定义方法;然后使用工厂创建子类(可能基于枚举开关),这些子类可以为您提供简单地做正确事情的对象。