Тестирование кода Android с помощью JUnit и JDK

Я пишу несколько тестов POJO для своего Android-кода.

Я хочу запускать их локально с JDK (не с Dalvik на эмуляторе) – для скорости, JUnit 4, Mockito и возможностью безголового без устройства – поэтому у меня есть отдельный проект «Java» в Eclipse.

Если метод, который я тестирую, ссылается на что-либо из Android SDK, например, android.util.Log , тест терпит неудачу – это имеет смысл, потому что android.jar не находится в пути к классам. Чтобы воспроизвести, у меня есть этот тестовый пример:

 public class FooTests { @Test public void testFoo() { android.util.Log.d("x", "y"); } } 

Если я добавлю android.jar явно к пути к классу тестового проекта, я получаю исключения, такие как

 java.lang.RuntimeException: Stub! at android.util.Log.d(Log.java:7) at com.example.FooTests.testFoo(FooTests.java:39) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ... at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 

Есть ли способ заставить код работать без издевательства над каждым последним словом зависимости Android SDK? Возможно, уже существует android.jar ?

EDIT : На данный момент я закончил обертку классов, таких как android.util.Log и ввел их в экземпляры для классического тестирования на основе IOC. Предложение Скотта PowerMock – это мой следующий шаг, когда он мне понадобится.

LATER EDIT : Robolectric !

Solutions Collecting From Web of "Тестирование кода Android с помощью JUnit и JDK"

Я не знаю, из чего он издевался. Я использую Powermock, чтобы издеваться над всем. Одна вещь, которую вы можете сделать, чтобы помочь с тяжелым насмешкой, – сделать ваши расширенные классы андроидов такими, как активность, фрагменты, вещатели и т. Д., И дать им делегировать классы pojo. Вы можете принять решение, основанное на риске, а не изолировать блок тестирования расширенных классов Android, и вместо этого модуль интеграции проверяет их через платформу тестирования Android и еще что-то вроде Robotium.

Для проверки подлинности изоляции в Android, для меня модульное тестирование на java jvm издевается над всеми сопутствующими классами – лучший способ.

У меня такая же проблема. Я хотел протестировать простые POJO локально.
В частности, мой код хотел использовать android.util.Base64.
То, что я закончил, это использовать SDK для установки источников Android 4 и скопировать класс android.util.Base64 в мой проект.
Удивительно, но это сработало.

У меня такая же проблема. Я хотел протестировать простую бизнес-логику локально. В частности, мой код использует android.util.SparseArray<E> .

Я попробовал 3 разных подхода, чтобы проверить его с помощью junit вне android.

  • В моей бизнес-логике я создал интерфейс и привязал его к MySparseArray<E> который наследуется от SparseArray<E> . В junit-тесте я повторно реализовал интерфейс, используя HashMap<Integer, E> . Это работает, но в конечном итоге это большая работа, чтобы сделать бизнес-логику единичной, если требуется другой android.* .
  • Как предложил @Tal Weiss, я добавил источники android java для требуемых классов: android.util.SparseArray.java который использует com.android.internal.util.ArrayUtils.java . Это тоже работает, но я не люблю добавлять дополнительные источники для Android, особенно если есть гораздо больше зависимостей
  • Я загрузил бесплатную двоичную версию android.jar для заглушки для старого Android 2.2 из http://grepcode.com/snapshot/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1 и включил его Как lib в мой junit-java-проект. Этот баннер содержит только классы для пространств имен android.* , com.android.* , dalvik.* И framework.base.* . Это тоже работает.

В настоящее время мне удалось избежать использования классов android.* SparseArray<E> в моем бизнес-уровне и не имеет зависимости от контекста, активности или службы. Я мог бы использовать HashMap<Integer, E> в слое android-business вместо SparseArray<E> .

Unmock-plugin может помочь https://github.com/bjoernQ/unmock-plugin . В моем случае это работает с SparseArray.

Не будут ли встроенные тесты android / junit делать то, что вы хотите?