2016-08-18 18 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を追加することです。

このフィールドはコードカバレッジの実行中にのみ存在するため、通常の単体テストは成功しますが、コードカバレッジの実行に失敗します。元のコードでは、この非文字列フィールドは必要ありません。

最善の解決策は、あなたが見ているフィールドが本当に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); 
     } 
    } 
} 
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のインスタンスであることを確認し、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); 
    } 
} 
関連する問題