【问题标题】:For testing purposes, how to add an additional element to an enum at runtime? [duplicate]出于测试目的,如何在运行时向枚举添加附加元素? [复制]
【发布时间】:2013-08-22 20:01:21
【问题描述】:

tl;dr: 我如何在运行时 - 出于测试目的 - 将另一个元素添加到枚举中?我确定必须使用一些字节操作库,例如 PowerMockito 的工作原理等。我确实认为这是"Can I add and remove elements of enumeration at runtime in Java" 的副本,因为我愿意忍受那种字节- 你不会在生产代码中做的操作或类加载器黑客,因为它是为了测试。


我正在编写 Java 单元测试并运行单元测试覆盖率报告。我无法到达的唯一行是在代码中,我在 switch 语句上有一个 default 案例,其中 enum 包含所有枚举。

枚举宠物{猫,狗; }

然后像这样的代码

final String speak;
switch( myPet ){
    case CAT:
        speak = "meow";
        break;

    case DOG:
        speak = "ruff";
        break;

    default:
        throw new IllegalArgumentException( "should not get here" );
}
System.out.println( speak );

需要拥有default 语句或javac 会抱怨最后一行正在使用可能未初始化的speak

但是,我无法覆盖该行,因为没有其他值,并且我不想为 生产 代码添加额外的枚举值以进行 测试时间>。

【问题讨论】:

  • 正确的解决方案是接受当你的某些行应该永远不会运行时,100% 的代码覆盖是不可能的。
  • @LouisWasserman 在这一点上,我更感兴趣的是需要什么样的类加载器黑魔法和/或字节码操作才能使其工作,而不是实际效果,它本身会充其量只是一个小红利。这比什么都重要。
  • 学习机会是,如果你需要施展黑魔法,你的目标错了吗?
  • 黑魔法教你JVM内部原理。

标签: java unit-testing enums classloader bytecode-manipulation


【解决方案1】:

除了您找到的可以使用 PowerMock 进行测试的答案(对它会出现的测试顺序有一些限制)之外,您还可以通过另一种方式进行此操作,即进行测试以证明代码无法访问。

即进行一个测试,遍历枚举的所有可能值,并且没有抛出异常并正确设置说话。

这将捕获枚举被修改并添加新值而不更新开关的情况。

【讨论】:

  • 问题的目标是 1) 学习如何使用一些黑魔法,以及 2) 从我们的测量工具中获得 100% 的线路覆盖率。
  • @ArtB 很公平,但问题并没有提到黑魔法是目标。此外,我会争辩说,如果一条线可证明不可访问,并且您有一个测试用例证明不可访问,那么您实际上拥有 100% 的测试覆盖率。
  • “字节 [代码] 操作”在我的书中是黑魔法的同义词。 :)
猜你喜欢
  • 2020-12-24
  • 2022-11-21
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 2010-10-03
  • 1970-01-01
  • 2013-10-14
  • 2022-01-18
相关资源
最近更新 更多