gpt4 book ai didi

java - 模拟 Java 枚举以添加一个值来测试失败案例

转载 作者:IT老高 更新时间:2023-10-28 20:35:23 29 4
gpt4 key购买 nike

我有一个 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 语句,我无法提供值。

扩展枚举以添加额外的值是不可能的,并且仅仅模拟 equals 方法以返回 false 也不起作用,因为生成的字节码使用窗帘后面的跳转表去正确的情况......所以我认为也许可以使用 PowerMock 或其他东西来实现一些黑魔法。

谢谢!

编辑:

由于我拥有枚举,我认为我可以只为值添加一个方法,从而完全避免切换问题;但我要留下这个问题,因为它仍然很有趣。

最佳答案

这是一个完整的例子。

代码几乎就像您的原始代码(只是简化了更好的测试验证):

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));
}
}

结果:

Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.628 sec

关于java - 模拟 Java 枚举以添加一个值来测试失败案例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5323505/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com