Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在测试中替换静态变量_Java_Junit_Static - Fatal编程技术网

Java 在测试中替换静态变量

Java 在测试中替换静态变量,java,junit,static,Java,Junit,Static,我有一个helper类,其中包含一些静态的最终字符串,如下所示 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")

我有一个helper类,其中包含一些静态的最终字符串,如下所示

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)
如何在测试中使用静态变量?

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

创建另一个模拟类,如下所示

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

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

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

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");

您应该首先模拟HelperClass类。我模拟了,但它仍然需要一个字段的方法istead,我已经更新了问题我尝试测试的代码在其逻辑中使用了this static字段。我希望它使用另一个变量,但使用相同的代码路径,我已经更新了这个问题,如果正在测试的代码路径可以被赋予mock对象,并且如果mock对象中的变量是通过getter访问的,那么您可以这样做。不过,正如前面所说的,你将无法做你想做的事情。这看起来更像是一个评论而不是一个答案(另外,你可以用多种方式模拟静态字段)。不过,总的来说,我同意这在Java中不是一个很好的模式。
setStatic(MyClass.class.getField("abc"), "xyz");