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)
问题在于,要产生代码覆盖率,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)
| 归档时间: |
|
| 查看次数: |
2482 次 |
| 最近记录: |