如何使用 JUnit、EasyMock 或 PowerMock 模拟静态最终变量
2022-09-01 14:04:12
我想模拟一个静态的最终变量,以及使用JUnit,EasyMock或PowerMock模拟i18n类。我该怎么做?
我想模拟一个静态的最终变量,以及使用JUnit,EasyMock或PowerMock模拟i18n类。我该怎么做?
有没有像嘲笑变量这样的事情?我称之为重新分配。我不认为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
删除时,不要忘记将字段重置为其原始值。
它可以使用PowerMock功能的组合来完成。使用注释进行静态模拟,模拟您的字段(我正在使用 ,但您可以使用等效的 EasyMock 构造),然后使用该方法设置您的值。请注意,即使您的变量是 .@PrepareForTest({...})
Mockito.mock(...)
WhiteBox.setInternalState(...)
private
有关扩展示例,请参阅此链接:http://codyaray.com/2012/05/mocking-static-java-util-logger-with-easymocks-powermock-extension