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

时间:2012-03-14 07:25:05

标签: java unit-testing junit easymock powermock

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

2 个答案:

答案 0 :(得分:39)

是否有类似模拟的变量?我会称之为重新分配。我不认为EasyMock或PowerMock会为您提供一种简单的方法来重新分配static final字段(这听起来像一个奇怪的用例)。

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

无论如何,您可以使用反射(来自:Using reflection to change static final File.separatorChar for 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

请勿忘记在拆除时将字段重置为原始值。

答案 1 :(得分:5)

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

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