28

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

4

2 回答 2

49

有没有类似模拟变量的东西?我会称之为重新分配。我认为 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

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

于 2012-03-14T08:04:06.543 回答
5

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

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

于 2013-06-03T21:06:14.607 回答