java.lang.ClassCastException : Z cannot be cast to java. lang.String

标签 java junit classcastexception eclemma

我收到一个错误:java.lang.ClassCastException: Z cannot be cast to java.lang.StringJunit 测试 上尝试运行覆盖率 (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/

相关文章:

java - "String[] args"在java中包含什么?

java - EasyMock:如何在集合顺序无关紧要的情况下验证值集合的方法顺序

java - 如何设置PowerMockito来验证不同类型的方法被调用?

java - LinkedHashMap$Entry 无法转换为 java.util.LinkedHashMap

java.lang.ClassCastException : android.graphics.drawable.ColorDrawable无法转换为android.graphics.drawable.BitmapDrawable

java - 计算耗时?

java - 如何在其他 Activity 中编辑同一对象

java - 保存和加载随机数不起作用

java - setUp/tearDown (@Before/@After) 为什么我们在 JUnit 中需要它们?

java.lang.ClassCastException : java.net.URI 无法转换为 java.net.URL