JUnit:是否可以模拟在全局变量的初始化中调用的静态方法?

丹尼尔·贝克

在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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

全局变量的初始化与函数内部的静态变量的初始化是否相同

静态全局变量初始化顺序

Python:无法从初始化文件导入在setUp方法中初始化的全局变量

可以抛出调用,但是不能从全局变量初始化程序中抛出错误

全局变量是否总是用零初始化?

在C#中,是否在调用main()方法之前初始化所有静态变量?

我可以重新初始化全局变量以覆盖其在C中的值吗?

JavaScript:在函数中初始化全局变量

C 头文件中的全局变量初始化

初始化 cuda 全局变量

如何初始化全局变量

进行全局变量初始化

初始化全局变量.Net

用C中的整数广播全局变量指针初始化全局变量

是否可以通过调用Toolkit来初始化非实例化类中的静态变量?

如何使用 gdb 跟踪在 main() 之前初始化的所有静态全局变量

是否可以在C ++中的类的静态方法中初始化静态成员?

在 C++ 中,用自身初始化全局变量是否具有未定义的行为?

是否可以在默认成员初始化程序中调用非静态成员函数?

是否可以确保仅在“静态初始化”步骤中调用函数

在C与C ++中使用函数调用初始化全局变量

为什么可以使用内联汇编代码的结果初始化全局变量?

是否保证Java全局变量首先进行初始化?

方法调用中的静态变量Null,但在程序中初始化

在Unity中哪里可以初始化静态变量?

是否可以模拟在测试类中实例化的对象

在全局变量的初始化/反初始化中使用隐式加载的DLL中的函数

显示模块模式-全局变量/初始化函数

全局变量0初始化的惩罚