java.lang.ClassCastException:无法将Z强制转换为java.lang.String

co.*_*har 3 java junit classcastexception eclemma

我遇到一个错误:java.lang.ClassCastException: Z cannot be cast to java.lang.String尝试在Junit测试上运行coverage(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;
}
Run Code Online (Sandbox Code Playgroud)

Tho*_*ger 6

问题在于,要产生代码覆盖率,EclEmma将一个字段添加private static final transient boolean[] $jacocoData到您的类中。

由于此字段仅在代码覆盖范围运行期间存在,因此正常的单元测试通过,但是代码覆盖范围运行失败:您的原始代码不希望使用此非String字段。

最好的解决方案是检查您看到的字段是否确实是String字段,否则跳过对该字段值的测试:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)