替换测试中的静态变量

时间:2017-04-03 14:13:07

标签: java junit static

我有一个带有一些静态最终字符串的辅助类,如下所示

public static final String abc = "abc"

在我的测试中,我想使用值

public static final String abc = "xyz"

所以我添加了以下内容

private static final HelperClass mock = mock(HelperClass.class);


@Before
when(mock.abc).thenReturn("xyz")

要测试的实际代码

public void codeToTest() {
  // use Helperclass.abc
  // other logic

但是这个声明是不允许的,因为它需要是一个方法调用。 (MissingMethodInvocation)如何在测试中使用静态变量?

3 个答案:

答案 0 :(得分:1)

静态值可能会使某些测试更加困难。您将无法使用模拟来获取此值。但我不得不问你为什么要嘲笑这个。它不是在帮助器类中测试任何东西来访问这个变量而你想要一个常量,为什么不在测试中定义和使用常量呢?

答案 1 :(得分:0)

创建另一个Mocked类,如下所示。

private static class MockedHelperClass  extends MockUp<HelperClass>
    {
        public static final String abc = "xyz"

        @Mock
        String getABC()
        {
            return abc;
        }
    }

然后在Test Method

中使用此模拟类
MockedHelperClass helperClass = new MockedHelperClass();
helperClass.abc = "xyz";
helperClass.getABC();

答案 2 :(得分:0)

您应该重新考虑您的设计,在测试中更改静态变量不是一个好习惯。但是,如果你真的想这样,你可以使用反射。

static void setStatic(Field field, Object value) throws Exception {
  field.setAccessible(true);
  Field modifiers = Field.class.getDeclaredField("modifiers");
  modifiers.setAccessible(true);
  modifiers.setInt(field, field.getModifiers() & ~Modifier.FINAL);
  field.set(null, value);
}

调用示例:

setStatic(MyClass.class.getField("abc"), "xyz");