我试图用Groovy编写一些Spock测试来测试一些Java代码(特别是Servlet过滤器)。我有一些private static
和private 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")
根据我从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] 删除。
我来说两句