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

标签 java unit-testing enums mocking code-coverage

我有一个 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/

相关文章:

java - 在单元/集成测试阶段将属性值注入(inject)/覆盖到 Spring Boot 属性文件

django - python运行测试: ImproperlyConfigured

java - 如何使用 Jackson 和默认类型对 EnumMap 进行(反)序列化?

java - 如何在java中打印带换行符的字符串

java - 使用 Java 在带有面板的网格中显示 ASCII 的最佳方法是什么?

unit-testing - jest js中的详细输出

json - Powershell-使用ConvertTo-Json保留所有Enum属性的文本

mysql - 使用什么语法来更新 mysql 中的 SET 列?

java - jsp:useBean 范围

java - Log4j2 自定义布局模式