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