使用Spock在Java中模拟私有静态最终变量

月:

我试图用Groovy编写一些Spock测试来测试一些Java代码(特别是Servlet过滤器)。我有一些private staticprivate static final我想嘲笑变量,但我不能确定是否有办法做到这一点。我知道metaClass方法可用,变量是否有类似的东西?

例如,我有:

public class MyFilter implements Filter {
  private static WebResource RESOURCE;
  private static final String CACHE_KEY = "key-to-be-used-for-cache";
  ... actual methods, etc ...
}

我尝试使用Mock(MyFilter),以及使用Java反射来更改值(基于此问题并回答使用Java反射来更改私有静态最终字段)。

我想在不添加Mockito或其他框架的情况下执行此操作,如果可能的话,只需使用普通的Groovy和Spock。

感谢您的任何想法!

更新1

至少对于private static变量,我确实可以做到以下几点:

Field field = MyFilter.class.getDeclaredField("CACHE_KEY")
field.setAccessible(true)
field.set(null, "new-key-value")

但是我仍然无法解决这个final问题。

更新2

感谢Xv。我现在可以使用以下设置:

Field field = MyFilter.class.getDeclaredField("CACHE_KEY")
field.setAccessible(true)

Field modifiersField = Field.class.getDeclaredField("modifiers")
modifiersField.setAccessible(true);
modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);

field.set(null, "new-key-value")
xverges:

根据我从https://stackoverflow.com/a/25031713/239408中学到的知识,这在spock中对我有用

import java.lang.reflect.Field
import java.lang.reflect.Modifier

...

    def setup() {

        Field field = BackendCredentials.getDeclaredField("logger")
        field.setAccessible(true);

        Field modifiersField = Field.class.getDeclaredField("modifiers");
        modifiersField.setAccessible(true);
        modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);

        field.set(null, Mock(Logger))
    }

看起来您缺少Modifier.FINAL标记的取消设置

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Java中“私有静态最终”和“公共静态最终”类变量的最接近Ruby表示?

使用Mockito或Jmockit模拟私有静态最终字段

枚举内的私有静态最终变量

声明私有静态最终变量的原因

使用Java反射更改私有静态最终字段

Android:使用Java反射更改私有静态最终字段

使用Spock在Java中存根或模拟静态方法

Java中的静态最终变量

在单例中使用“私有静态最终字符串”变量的最佳实践

在Java中使用属性文件* AS *静态最终变量中的属性

Java中的静态最终变量在哪里使用?

Java中私有静态变量的用途是什么?

最终和私有静态

私有静态最终字段

Java模拟私有最终字段或响应表单RestHighLevelClient

使用弹簧注入分配私有静态最终字段成员

Java静态方法访问私有变量

在Java中,是否有理由对仅使用一次的字符串使用静态最终变量?

java - 如何在java中的被测类中注入被声明为私有静态的对象的模拟?

如何使用Spock在LocalDate中模拟静态方法?

在PowerMock中是否可以对私有静态方法使用部分模拟?

非静态类中私有静态变量的范围

如何使用PowerMockito模拟私有静态方法?

私有静态字段不是最终的吗?

测试内部使用Java中另一个私有静态方法的私有静态方法

无法定义私有静态最终变量,因为它会引发异常

是否可以将@Qualifier批注设置为Java类中的私有静态变量?

Java反射,更改私有静态最终字段没有做任何事情

如何模拟由静态方法设置的最终静态变量?