在Java中,我有一个类似的类
public class A {
private final Map<Integer, String> steps = ImmutableMap.of(
1, "one"
);
public String getStepOne() {
return steps.get(1);
}
}
现在,我需要以某种方式在单元测试中模拟此全局变量。不幸的是,我被告知要避免出于测试目的而对被测类的源代码进行任何更改,尤其是仅提供getter并不是令人满意的解决方案。我的尝试是模拟静态方法调用,例如
@RunWith(PowerMockRunner.class)
@PrepareForTest({A.class, ImmutableMap.class})
public class ATest {
private A subj = new A();
@Before
public void setUp() {
PowerMockito.mockStatic(ImmutableMap.class);
ImmutableMap<Object, Object> mockedMap = ImmutableMap.of(1, "NEW ONE");
BDDMockito.given(ImmutableMap.of()).willReturn(mockedMap);
}
@Test
public void testGetStepOne() {
System.out.println(subj.getStepOne());
}
}
但这是行不通的,它会打印“ one
”而不是“ NEW ONE
”。我怀疑如果从全局变量的初始化中调用静态方法调用这种方式是不可能的……有人知道是否有任何方法可以模拟此变量(如我所说,无需更改类A
)?
============编辑==================
好吧,我同意,模拟一个不可变的地图通常没有多大意义,但是实际上,该地图看起来更像这样:
private final Map<Integer, B> steps = ImmutableMap.of(
1, new B()
);
我真正需要的是模拟类型B的对象,该对象是值之一,因为它是通过类的其他方法访问的steps.get(...)
。
一个纯Java解决方案可能是在@Before
方法中使用反射。诀窍是先摆脱final
属性,然后再更改值。请参阅第一个答案:使用Java Reflection更改private static final字段。非静态成员也应如此。请参阅以下文章中修改后的代码:Java反射示例以更改最终成员
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句