2016-08-18 5 views
-1

Я получаю сообщение об ошибке: java.lang.ClassCastException: Z cannot be cast to java.lang.String при попытке запустить покрытие (EclEmma) на Тест Junit. Если я регулярно запускаю тест (без покрытия), он проходит.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)' is 'null'. Лучше использовать 'Objects.toString (field.get (this))'. –

+0

Ты, как я могу исправить себя – NatNgs

+0

@ AndyTurner, как это может быть, что ты всегда там и правильно, а еще меньше 30 тыс. Репу? :) – 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); 
    } 
}