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