Подтвердить что ты не робот

Как издеваться над статической конечной переменной с помощью JUnit, EasyMock или PowerMock

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

4b9b3361

Ответ 1

Есть ли что-то вроде насмешки над переменной? Я бы назвал это повторно назначением. Я не думаю, что 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

Не забывайте reset поле к его исходному значению при срыве.

Ответ 2

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

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

Ответ 3

https://github.com/zhangyanwei/staticmock

  • StaticMockito.enhanceClass( "xxx.Utility" );
  • StaticMockito.initMock(Utility.class);
  • когда (Utility.toClientId(CLIENTNAME)) thenReturn ( "имя" ). проверить (глумливо (Utility.class)) toClientId (CLIENTNAME);.