我有一个enum或多或少像这样切换:
public static enum MyEnum {A, B}
public int foo(MyEnum value) {
switch(value) {
case(A): return calculateSomething();
case(B): return calculateSomethingElse();
}
throw new IllegalArgumentException("Do not know how to handle " + value);
}
我希望测试涵盖所有行,但由于代码预计会处理所有可能性,因此我无法在 switch 中提供没有相应 case 语句的值。
扩展枚举来添加额外的值是不可能的,并且只是模拟 equals 方法来返回false
也不会工作,因为生成的字节码在幕后使用跳转表来转到正确的情况...所以我认为也许可以使用 PowerMock 或其他东西来实现一些黑魔法。
Thanks!
edit:
由于我拥有枚举,我认为我可以向值添加一个方法,从而完全避免切换问题;但我留下这个问题,因为它仍然很有趣。
这是一个完整的例子。
该代码几乎与您的原始代码相似(只是简化了更好的测试验证):
public enum MyEnum {A, B}
public class Bar {
public int foo(MyEnum value) {
switch (value) {
case A: return 1;
case B: return 2;
}
throw new IllegalArgumentException("Do not know how to handle " + value);
}
}
这是具有完整代码覆盖率的单元测试,该测试适用于 Powermock (1.4.10)、Mockito (1.8.5) 和 JUnit (4.8.2):
@RunWith(PowerMockRunner.class)
public class BarTest {
private Bar bar;
@Before
public void createBar() {
bar = new Bar();
}
@Test(expected = IllegalArgumentException.class)
@PrepareForTest(MyEnum.class)
public void unknownValueShouldThrowException() throws Exception {
MyEnum C = mock(MyEnum.class);
when(C.ordinal()).thenReturn(2);
PowerMockito.mockStatic(MyEnum.class);
PowerMockito.when(MyEnum.values()).thenReturn(new MyEnum[]{MyEnum.A, MyEnum.B, C});
bar.foo(C);
}
@Test
public void AShouldReturn1() {
assertEquals(1, bar.foo(MyEnum.A));
}
@Test
public void BShouldReturn2() {
assertEquals(2, bar.foo(MyEnum.B));
}
}
Result:
Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.628 sec
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)