【发布时间】: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