5

我收到一个错误:java.lang.ClassCastException: Z cannot be cast to java.lang.String尝试在Junit test上运行覆盖率 (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;
}
4

3 回答 3

8

问题是要生成代码覆盖率 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);
        }
    }
}
于 2016-08-19T11:07:00.553 回答
0

尝试这样做:

String value = "null";
if(field.get(this) != null)
    value = field.get(this).toString();

而不是这个:

String value = (String) field.get(this);
于 2016-08-18T07:41:31.367 回答
0

最后,我检查了字段值是实例,String并用函数替换了转换为字符串toString()

String value = null;
Object fieldValue = field.get(this);
if (fieldValue instanceof String) {
    value = fieldValue.toString();
}

if ("N".equals(value)) {
    if (!errors.containsKey(field.getName())) {
        errors.put(field.getName(), value);
    }
}
于 2016-08-18T08:50:48.273 回答