我正在尝试在具有构造函数的类中为 JUnit 测试设置一个private static final
字段。private
当我将代码归结为基础时,我得到以下信息:
public class Foo {
private static final boolean FLAG = false;
private Foo() { /* don't call me */ }
public static boolean get() { return FLAG; }
}
我的测试如下所示:
@RunWith(PowerMockRunner.class)
@PrepareEverythingForTest // Whitebox fails without this line
public class FooTest {
@Test
public void testGet() {
Whitebox.setInternalState(Foo.class, "FLAG", true);
assertTrue(Foo.get());
}
}
这是我的 POM 文件的摘录:
<junit.version>4.11</junit.version>
<powermock.version>1.5.4</powermock.version>
<mockito.version>1.9.5</mockito.version>
当我在 上设置断点时return FLAG;
,我可以清楚地看到在 IntelliJ 的调试器FLAG
中设置为。true
然而,测试失败了AssertionError
。
有什么想法可以使这项工作有效吗?
更新:使用反射似乎也不起作用:
@Test
public void testGet_usingReflection() throws Exception {
setField(Whitebox.invokeConstructor(Foo.class), "FLAG", true);
assertTrue(Foo.get());
}
public static void setField(Object targetObject, String fieldName, Object value) throws NoSuchFieldException, IllegalAccessException {
Class clazz = targetObject.getClass();
Field field = clazz.getDeclaredField(fieldName);
field.setAccessible(true);
Field modifiers = Field.class.getDeclaredField("modifiers");
modifiers.setAccessible(true);
modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(targetObject, value);
}
该setField()
方法是我可以通过内部库获得的方法。不幸的是,它产生了相同的结果:AssertionError
更新 2:完全摆脱 PowerMock 显然也没有多大帮助:
@Test
public void testGet_usingReflectionWithoutPowerMock() throws Exception {
setField(Foo.class.getDeclaredField("FLAG"), true);
assertTrue(Foo.get());
}
public static void setField(Field field, Object value) throws NoSuchFieldException, IllegalAccessException {
field.setAccessible(true);
Field modifiers = Field.class.getDeclaredField("modifiers");
modifiers.setAccessible(true);
modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);
field.set(null, value);
}
为此,我什至从类级别中删除了 PowerMock 注释......
我现在也将此问题发布到PowerMock 邮件列表。