- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在我的项目上运行 mvn clean cobertura:cobertura install
但其中一个测试失败了。
该测试尝试访问一个带有通过反射编写的构建器的类。
public MyClass(Builder builder) throws Exception {
Field[] classFields = MyClass.class.getDeclaredFields();
Field[] classBuilderFields = Builder.class.getDeclaredFields();
for (int i = 0; i < classBuilderFields.length; i++) {
Field fieldInClass = classFields[i];
Field fieldInBuilder = classBuilderFields[i];
fieldInBuilder.setAccessible(true);
String fieldNameInClass = fieldInClass.getName();
String fieldNameInBuilder = fieldInBuilder.getName();
if (null != fieldNameInClass && null != fieldNameInBuilder && fieldNameInClass.equals(fieldNameInBuilder)) {
fieldInClass.set(this, fieldInBuilder.get(builder));
} else {
throw new Exception("");
}
}
}
我调试了代码,发现 cobertura 在我的类 __cobertura_counters 中“实现”了它自己的一个变量。这是异常(exception)情况:
java.lang.IllegalAccessException: Can not set static final [I field com.domain.MyClass.__cobertura_counters to
at sun.reflect.UnsafeFieldAccessorImpl.throwFinalFieldIllegalAccessException(UnsafeFieldAccessorImpl.java:73)
at sun.reflect.UnsafeFieldAccessorImpl.throwFinalFieldIllegalAccessException(UnsafeFieldAccessorImpl.java:77)
at sun.reflect.UnsafeQualifiedStaticObjectFieldAccessorImpl.set(UnsafeQualifiedStaticObjectFieldAccessorImpl.java:77)
at java.lang.reflect.Field.set(Field.java:741)
at com.domain.MyClass.<init>(MyClass.java:217)
at com.domain.MyClassTest.setUp(MyClassTest.java:57)
at com.domain.MyClass$Builder.build(MyClass.java:197)
我该如何解决这个问题?
最佳答案
是的,Cobertura 添加了这个字段,因此它可以跟踪访问了哪些代码。出于类似的目的,其他代码覆盖工具添加了类似的字段。生成的字段具有此签名:
public static final transient int[] __cobertura_counters;
您可以做的只是忽略代码中的 transient 字段。你可以这样做:
if (!Modifier.isTransient(fieldInClass.getModifiers())) {
// do a thing
}
但是请注意,非生成的代码也可以有 transient 字段,因此根据您要反射(reflect)的代码,这可能是也可能不是一个选项。否则,您唯一的选择 (AFAIK) 是简单地检查是否 fieldInClass.getName().equals("__cobertura_counters")
。
通常,编译器生成的字段会被标记为“合成的”。例如,javac 为非静态内部类生成的 this$0
字段是合成的。检查它非常容易:fieldInClass.isSynthetic()
。但是,出于某种原因,Cobertura 不遵循此约定。
关于java - cobertura 未能通过反射类测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34018248/
我很快就会明白,我不是 Git 甚至 Gitkraken 的高手。因此,我只有一个修补程序、一个主分支和一个功能分支。我在修补程序、提交、推送和 merge 到 master 中进行更改(然后我也推送
我刚开始使用 stub 请求来测试对 iOS 的外部 API 的异步调用。我目前被以下代码困住了,我无法弄清楚什么不起作用。 我想要实现的非常简单的事情是,如果我从网站收到 200 响应,我将 Vie
设置: 一个 JPA ReviewRepository延长 CrudRepository 我的测试使用切片测试注释 @DataJpaTest 我的测试@Autowired ReviewReposito
我尝试通过logstash将csv文件vrom filebeat摄取到hdfs中。 Filebeat 成功将其转移到 logstash,因为我使用 stdout{codec=>rubydebug} 并
我看到很多教程解释了如何在 Tensorflow 的 Bazel WORKSPACE 中构建项目(例如 this one)。但我似乎无法找到一种方法来构建我自己的项目并将 tensorflow 作为依
我正在运行 Ubuntu 10.04 并且最初安装了 ruby 1.9.1(来自源代码)。我刚刚决定试用 ruby 1.9.2 和 rails 3,现在似乎是使用 rvm 处理多个 ruby
我有一个应用程序从后端接收支持的语言环境列表作为以下响应: {locales: [{code: 'enUS'}, {code: 'deDE'}, {code: 'arAR'}]} 我想使用 date-
我是一名优秀的程序员,十分优秀!