我收到一个错误:java.lang.ClassCastException: Z cannot be cast to java.lang.String
在 Junit 测试 上尝试运行覆盖率 (EclEmma) 时。如果我定期运行测试(没有覆盖),那么它就会通过。
这是代码(类中的所有字段都是 Strings
):
@Override
public Map<String, String> getErrors() throws IllegalAccessException, IllegalArgumentException {
Map<String, String> errors = new HashMap<String, String>();
for (Field field : this.getClass().getDeclaredFields()) {
field.setAccessible(true);
String value = (String) field.get(this);
if (value.equals("N")) {
if (!errors.containsKey(field.getName())) {
errors.put(field.getName(), value);
}
}
}
return errors;
}
最佳答案
问题是为了产生代码覆盖率,EclEmma 添加了一个字段 private static final transient boolean[] $jacocoData
到你的类。
由于此字段仅在代码覆盖运行期间出现,因此正常的单元测试通过,但代码覆盖运行失败:您的原始代码不期望此非字符串字段。
最好的解决方案是检查您看到的字段是否真的是一个字符串字段,否则跳过字段值的测试:
for (Field field : this.getClass().getDeclaredFields()) {
field.setAccessible(true);
if (field.getType() != String.class) {
continue;
}
String value = (String) field.get(this);
if (value.equals("N")) {
if (!errors.containsKey(field.getName())) {
errors.put(field.getName(), value);
}
}
}
关于java.lang.ClassCastException : Z cannot be cast to java. lang.String,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39012327/