java.lang.ClassCastException: Z 无法转换为 java.lang.String
java.lang.ClassCastException: Z cannot be cast to java.lang.String
我在Junit 测试 上尝试运行 覆盖率(EclEmma) 时遇到错误:java.lang.ClassCastException: Z cannot be cast to java.lang.String
。如果我 运行 定期测试(没有覆盖)然后它通过。
这是代码(class中的所有字段都是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;
}
尝试这样做:
String value = "null";
if(field.get(this) != null)
value = field.get(this).toString();
而不是这个:
String value = (String) field.get(this);
最后,我检查了字段值是 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);
}
}
问题在于,为了产生代码覆盖率,EclEmma 添加了一个字段 private static final transient boolean[] $jacocoData
到您的 class。
由于此字段仅在代码覆盖 运行 期间出现,因此正常的单元测试通过,但代码覆盖 运行 失败:您的原始代码不需要此非字符串字段。
最好的解决方案是检查您看到的字段是否真的是字符串字段,否则跳过字段值的测试:
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);
}
}
}
我在Junit 测试 上尝试运行 覆盖率(EclEmma) 时遇到错误:java.lang.ClassCastException: Z cannot be cast to java.lang.String
。如果我 运行 定期测试(没有覆盖)然后它通过。
这是代码(class中的所有字段都是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;
}
尝试这样做:
String value = "null";
if(field.get(this) != null)
value = field.get(this).toString();
而不是这个:
String value = (String) field.get(this);
最后,我检查了字段值是 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);
}
}
问题在于,为了产生代码覆盖率,EclEmma 添加了一个字段 private static final transient boolean[] $jacocoData
到您的 class。
由于此字段仅在代码覆盖 运行 期间出现,因此正常的单元测试通过,但代码覆盖 运行 失败:您的原始代码不需要此非字符串字段。
最好的解决方案是检查您看到的字段是否真的是字符串字段,否则跳过字段值的测试:
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);
}
}
}