Ошибка при создании значения фиктивного перечисления для тестирования Junit - PullRequest
0 голосов
/ 29 июня 2018

У меня есть перечислимый класс: -

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, чтобы смоделировать этот класс enum, чтобы я мог добавить другое значение enum к этому действию для тестирования 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 голосов
/ 30 июня 2018

Я мог бы дать здесь ответ, который не очень подходит для вопроса, но я все равно попробую. IMO, вы не должны действительно добавлять значения в Enum. Это просто не имеет смысла с перечислениями.

Enum - это список возможных значений, используемых программой. Если вы добавляете в него дополнительные значения в макете, это все равно что сказать: эй, я больше не хочу тестировать свой код, но я хочу протестировать то, чего никогда не происходит в реальной жизни. Это звучит неправильно.

Вместо этого, вероятно, вам следует спросить себя «что именно вы хотите проверить» и изменить логику своего теста так, чтобы он опирался только на «реальные» значения, возвращаемые из enum.

Я даже могу сказать, что в моей практике мне никогда не приходилось издеваться над перечислением с помощью какого-либо инструмента, хотя это, вероятно, не способствует ответу:)

Кроме того, теперь вы должны использовать PowerMock, который является очень тяжелым и неприятным инструментом для работы (на самом деле, многие наши коллеги считают его чем-то, что следует использовать, только если вам нужно протестировать устаревший код, который не - кто-то хочет когда-либо измениться).

0 голосов
/ 29 июня 2018

Мне удалось смоделировать мой enum и добавить к нему фиктивное значение, используя приведенный ниже код.

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