Как юнит-тестирование Log.e в Android?

Мне нужно выполнить модульный тест, в котором мне нужно проверить, регистрируется ли сообщение об ошибке при возникновении определенного состояния в моем приложении.

  try {
        //do something
    } catch (ClassCastException | IndexOutOfBoundsException e) {
        Log.e(INFOTAG, "Exception "+e.getMessage());
    }

Как я могу проверить это? Я получаю приведенную ниже ошибку при модульном тестировании.

Caused by: java.lang.RuntimeException: Method e in android.util.Log not mocked.

1 ответ

Решение

Есть два способа сделать это:

  1. Вы поворачиваетесь к Powermock или Powermokito; поскольку эти насмешливые рамки позволят вам смоделировать / проверить этот статический вызов Log.e().
  2. Вы могли бы рассмотреть вопрос о замене статического вызова.

Пример:

interface LogWrapper {
   public void e( whatever Log.e needs);
}

class LogImpl implements LogWrapper {
   @Override 
   e ( whatever ) { 
    Log.e (whatever) ; 
   }

И затем, вы должны использовать внедрение зависимостей, чтобы сделать LogWrapper Объект доступен в классах, которые вы хотите войти. Для обычного "производственного" использования этот объект является просто экземпляром LogImpl; для тестирования вы можете использовать либо самописанный impl (который отслеживает отправленные ему журналы); или вы можете использовать любую из не-мощных фреймворков (например, EasyMock или Mokito), чтобы имитировать это. А затем вы используете аспект проверки / проверки в системе макетов для проверки "журнал был вызван с ожидаемыми параметрами".

Обратите внимание: в зависимости от ваших настроек, вариант 2 может быть излишним. Но я лично избегаю использования Powermock; просто потому, что я потратил слишком много часов своей жизни, выискивая причудливые проблемы с Powermock. И мне нравится делать измерения покрытия; и иногда Powermock также доставляет вам проблемы.

Но, как вы спрашиваете о Powermock, вы в основном хотите посмотреть здесь (powermockito) или здесь (powermock). И для справки: попробуйте использовать ваш любимый поисковик в следующий раз. Это действительно не так, как вы первый человек, спрашивающий об этом.

Другие вопросы по тегам