使用Java中的Mockito模拟枚举

时间:2016-07-06 12:53:22

标签: java unit-testing enums mockito

如何使用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不能模仿枚举,但答案也是在一年多前提供的。我可以同时嘲笑enum还是让我让分支保持未经测试?其他Mocking框架不能使用。

1 个答案:

答案 0 :(得分:6)

有两个答案:

a)你可以转向一些类似PowerMock的模拟框架。我在那里得到两分钱(不足):不要这样做。 PowerMock打开了通往痛苦之地的大门;你不想进入。

b)在你的枚举上放置接口

严重;我现在认为枚举只有一个好的用例;那就是将它们用作提供某种服务的单身人士。然后,我这样做:

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设计 - 你有定义方法的抽象基类;然后你使用工厂创建子类(可能基于枚举开关),为你提供简单做对的事物。