为Junit测试创建模拟枚举值时出错

时间:2018-06-29 19:50:05

标签: java junit enums powermock

我有一个枚举类:-

public enum Action {
    LOGGED_IN("logged_in"), 
    LOGGED_OUT("logged_out"),
    private final String action;

    /**
     * @param action
     */
    private Action(String action) {
        this.action = action;
    }

    /**Fetches the action.
     * @return String action
     */
    public String getAction() {
        return this.action;
    }
}

我正在编写下面的Junit来模拟此枚举类,以便可以向此Action添加另一个枚举值以进行junit测试。

@RunWith(PowerMockRunner.class)
public class TestClass{

    public Action action;

@Test
    @PrepareForTest(Action.class)
    public void testgetFeatureIdNull() NoSuchFieldException, SecurityException {
        Action dummy = PowerMockito.mock(Action.class);
        Field value=Action.class.getDeclaredField("value");
        value.setAccessible(true);
        Whitebox.setInternalState(dummy, "value", "dummy");
        Whitebox.setInternalState(dummy,"ordinal", 2);
        request = "{" + "   opportunityNumber: 45," + " id: 1," + "   " + " s: {" + "   id: 23"
                + " }" + "}";
        action = Action.LOGGED_IN;
        assertEquals(null, PatternGenertor.getFeatureid(dummy, request));
    }

运行此代码时,出现以下错误:-

java.lang.NoSuchFieldException: value
    at java.lang.Class.getDeclaredField(Unknown Source)

有人可以告诉我我在哪里做错了吗?

2 个答案:

答案 0 :(得分:1)

我可能会在这里给出一个不太适合某个问题的答案,但是我还是会尝试的。 IMO,您不应该在Enum中真正添加值。枚举根本没有意义。

Enum是包含程序使用的可能值的列表的东西。 如果您在模拟中为其添加更多值,这就像在说-嘿,我不想再测试我的代码,但是我想测试现实生活中永远不会发生的事情。这听起来不对。

相反,可能您应该问自己“您想测试什么”并更改测试逻辑,以使其仅依赖于从枚举返回的“实际”值。

我什至可以说,在我的实践中,我从未用任何工具来模拟枚举,尽管它可能对答案没有帮助:)

此外,您现在必须使用PowerMock,它是一个非常沉重且令人不愉快的工具(实际上,它被许多同事认为是只有在必须测试不带代码的遗留代码时才应使用的工具) -一个人想要改变)。

答案 1 :(得分:0)

我能够模拟我的枚举,并使用以下代码向其添加一个虚拟值。

@Test
    @PrepareForTest(Action.class)
    public void testgetFeatureIdNull() throws  NoSuchFieldException, SecurityException, NoSuchMethodException {
        Action dummy = PowerMockito.mock(Action.class);
        Method value=Action.class.getSuperclass().getDeclaredMethod("ordinal");
        value.setAccessible(true);
        Field value1=Action.class.getSuperclass().getDeclaredField("name");
        value1.setAccessible(true);

        Whitebox.setInternalState(dummy, "name", "dummy");
        Whitebox.setInternalState(dummy,"ordinal", 2);
        PowerMockito.mockStatic(Action.class);

        PowerMockito.when(Action.values()).thenReturn(new Action[]{Action.LOGGED_IN,Action.LOGGED_OUT, dummy});

        request = "{" + "   opportunityNumber: 34," + " id: 1," + "   " + " s: {" + "   id: 23"
                + " }" + "}";
        assertNull(PatternGenertor.getFeatureid(dummy, request));
    }