2016-08-18 120 views
-1

我在嘗試運行Junit測試上的覆蓋範圍(EclEmma)時收到錯誤:java.lang.ClassCastException: Z cannot be cast to java.lang.String。如果我定期運行測試(沒有覆蓋),那麼它就會通過。java.lang.ClassCastException:Z不能轉換爲java.lang.String

這是代碼(類中的所有字段是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; 
} 
+0

是代碼混淆? – Henry

回答

1

問題是,要生成代碼覆蓋率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); 
     } 
    } 
} 
0

嘗試這樣做:

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

取而代之的是:

String value = (String) field.get(this); 
+2

請注意,如果'field.get(this)'爲'null',則可能會失敗。最好使用'Objects.toString(field.get(this))'。 –

+0

你很正常,我糾正自己 – NatNgs

+0

@AndyTurner怎麼會這樣,你總是在那裏,正確,還不到30k repu? :) – xenteros

0

最後,我檢查了字段值是String的實例,並將cast轉換爲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); 
    } 
} 
相關問題