如何使用 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
}
}
如何模拟枚举以到达 switch 循环的默认分支?这个答案 https://stackoverflow.com/questions/25929351/unit-test-for-enum-value-that-doesnt-exist#25930885说 Mockito 不能模拟枚举,但一年多前就已经提供了答案。我可以同时模拟一个枚举还是让分支保持未经测试的状态?无法使用其他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 语句;当您添加/删除枚举案例时,会产生所有负面后果。
因此,就您的情况而言:考虑转向真正的面向对象设计 - 您拥有定义方法的抽象基类;然后使用工厂创建子类(可能基于枚举开关),这些子类为您提供只做正确事情的对象。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)