java - 在 Java 中使用 Mockito 模拟枚举

标签 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 不能模拟枚举,但一年多前也提供了答案。我可以同时模拟枚举还是让分支保持未经测试的状态?不能使用其他 Mocking 框架。

最佳答案

有两个答案:

a) 您可以求助于一些类似于 PowerMock 的模拟框架。我的两分(句子)在那里:不要那样做。 PowerMock 打开了一扇通向痛苦之地的大门;您不想输入的内容。

b) 将接口(interface)放在你的枚举上

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

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()

当然,当您像现在这样使用枚举时,这并没有多大帮助。但问题是:无论如何你都不应该那样使用枚举。因为以这种方式使用枚举会导致代码 splinter ——每个使用枚举变量的地方都需要这样的 switch 语句;当您添加/删除枚举案例时会产生所有负面后果。

因此,在你的情况下:考虑转向真正的 OO 设计——你有定义方法的抽象基类;然后您使用工厂创建子类(可能基于枚举开关),这些子类为您提供只做正确事情的对象。

关于java - 在 Java 中使用 Mockito 模拟枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38224517/

相关文章:

java - 使用什么来代替简单的 JdbcTestUtils?

java - 一个 JUnit 如何测试交互式的、基于文本的 Java 应用程序?

Java接口(interface)中的注解值

java - 在 Java 中为枚举值设置空字符串

java - 是否可以在类的方法中 @InjectMocks 到临时对象实例中?

java - 使用分隔符分隔模式

c# - 使用inlinedata时是否可以使用string.empty?

Java 枚举垃圾回收和枚举变量差异

Java 压缩正在更改创建文件的日期

java - 如何检查数组列表中的对象是否具有相同的值?