Как смоделировать статическую конечную переменную, используя JUnit, EasyMock или PowerMock - PullRequest
23 голосов
/ 14 марта 2012

Я хочу смоделировать статическую конечную переменную, а также смоделировать класс i18n, используя JUnit, EasyMock или PowerMock. Как мне это сделать?

Ответы [ 2 ]

40 голосов
/ 14 марта 2012

Есть ли что-то вроде насмешка переменная? Я бы назвал это переназначением. Я не думаю, что EasyMock или PowerMock дадут вам простой способ переназначить поле static final (звучит как странный вариант использования).

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

В любом случае, вы можете добиться этого, используя отражение (от: Используя отражение для изменения статического финала File.separatorChar для модульного тестирования? ):

static void setFinalStatic(Field field, Object newValue) throws Exception {
    field.setAccessible(true);

    // remove final modifier from field
    Field modifiersField = Field.class.getDeclaredField("modifiers");
    modifiersField.setAccessible(true);
    modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);

    field.set(null, newValue);
}

Используйте его следующим образом:

setFinalStatic(MyClass.class.getField("myField"), "newValue"); // For a String

Не забудьте восстановить исходное значение поля при сносе.

5 голосов
/ 04 июня 2013

Это можно сделать с помощью комбинации функций PowerMock. Статическое моделирование с использованием аннотации @PrepareForTest({...}), моделирование вашего поля (я использую Mockito.mock(...), но вы можете использовать эквивалентную конструкцию EasyMock), а затем настройку значения с помощью метода WhiteBox.setInternalState(...). Обратите внимание, что это будет работать, даже если ваша переменная private.

См. Эту ссылку для расширенного примера: http://codyaray.com/2012/05/mocking-static-java-util-logger-with-easymocks-powermock-extension

...