如何使用JUnit,EasyMock或PowerMock模拟静态最终变量

我想模拟静态最终变量以及使用JUnit,EasyMock或PowerMock模拟i18n类。 我怎么做?

是否有类似嘲弄变量的东西? 我会称之为重新分配。 我不认为EasyMock或PowerMock会给你一个简单的方法来重新分配一个static final字段(听起来像一个奇怪的用例)。

如果你想这样做,你的设计可能有问题:如果你知道一个变量可能有另一个值,即使是出于测试目的,也要避免static final (或更常见的是全局常量)。

无论如何,您可以使用reflection来实现(来自: 使用reflection来更改静态最终File.separatorChar以进行unit testing? ):

 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 

拆除时不要忘记将字段重置为原始值。

它可以使用PowerMockfunction的组合来完成。 使用@PrepareForTest({...})注释静态@PrepareForTest({...})你的字段(我使用Mockito.mock(...) ,但你可以使用等效的EasyMock构造)然后使用WhiteBox.setInternalState(...)设置你的值WhiteBox.setInternalState(...)方法。 请注意,即使您的变量是private这也会有效。

有关扩展示例,请参阅此链接: http : //codyaray.com/2012/05/mocking-static-java-util-logger-with-easymocks-powermock-extension