Я хочу издеваться над статической конечной переменной, а также издеваться над классом i18n с помощью JUnit, EasyMock или PowerMock. Как это сделать?
Как издеваться над статической конечной переменной с помощью JUnit, EasyMock или PowerMock
Ответ 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);.