在Java中使用Mockito模拟枚举
问题描述:
如何使用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框架不能使用。
答
有两个答案到:
一)你可以把一些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设计 - 你有抽象基类定义方法;然后使用工厂创建子类(可能基于枚举开关),这些子类可以为您提供简单地做正确事情的对象。
有这样的hacky方法:[黑客入侵和修改“最终静态”字段](http://www.javaspecialists.eu/archive/Issue161.html) – Jesper
枚举就像静态类,因此你可以'用mookito把它们剔除。在你的示例中,默认是无法访问的,所以你不能测试它。 –
为什么要测试不可达路径? – Manu