在 Java 中使用 Mockito 模拟枚举

2024-03-05

如何使用 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(使用前将#替换为@)

在 Java 中使用 Mockito 模拟枚举 的相关文章

随机推荐