使用Java中的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框架不能使用.

最佳答案
有两个答案:

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

转载注明原文:使用Java中的Mockito模拟枚举 - 代码日志