Лучший способ быстро запустить тесты JUnit в Android-проекте в Android Studio

У меня есть некоторые простые старые классы Java и простые тесты JUnit в моем проекте Android Studio. В настоящее время они живут в моем Android-модуле. Если я запускаю их в качестве тестов на Android, они проходят отлично, но они очень медленны, так как для запуска или подключения к эмулятору требуется.

Если я попытаюсь запустить его как тест JUnit, я ударил !!! JUnit version 3.8 or later expected !!! JUnit version 3.8 or later expected версии JUnit. Этот ответ объясняет, как решить эту проблему. К сожалению, я тогда ударил java.lang.NoClassDefFoundError: junit/textui/ResultPrinter , который я не могу понять, как исправить.

Затем я попытался перенести тесты JUnit на отдельный модуль Java, который зависит от модуля Android. Все прекрасно компилируется. Я добавил новую конфигурацию для запуска тестов JUnit (: MyJUnitTests: test), но тесты не с package com.myproject.util does not exist . Похоже, что classpath не включает классы из зависимого модуля Android.

Кто-нибудь знает, как исправить эту проблему в классе? Я просмотрел множество связанных ответов, и никто из них, похоже, не работает для меня. Или это просто плохая идея, чтобы попытаться сохранить тесты JUnit в своем собственном модуле?

Я могу заставить тесты JUnit работать быстро и проходить, если переместить мои простые классы Java и их тесты JUnit в совершенно отдельный модуль (например, здесь ) и отменить зависимость, чтобы модуль Android зависел от модуля Java. Это предпочтительное решение?

Основная проблема заключается в том, что классы Android Framework не очень хорошо работают вне контекста ОС Android, поэтому любой код, который имеет зависимости от классов Framework, не работает в обычной среде JUnit, как вы уже нашли.

Ваше решение по попытке переместить тесты JUnit в отдельный модуль не будет работать, потому что у вас не может быть простой Java-модуль в зависимости от модуля Android. Модули Android Gradle не действуют как модули Java, потому что сбор Android намного сложнее, и поскольку конечным результатом сборки модуля Android будет APK или AAR, которые другие типы модулей не поймут.

Если вы можете перенести простые Java-классы и модульные тесты на простой Java-модуль и зависеть от модулей Android, это будет наилучший подход, который получит максимальную поддержку от официальных функций в среде IDE. Это также будет иметь архитектурное преимущество в том, что он сохранит эти классы бесплатно от абстракций Android, сделает его более портативным и обеспечит разделение бизнес-логики с пользовательским интерфейсом или хранилищем или другими вещами, более специфичными для устройства.

Если вам это сложно сделать, то многие разработчики в вашей обуви идут с Robolectric , который является тестовым жгутом, позволяющим коду в зависимости от многих частей Android Framework работать в среде JUnit без эмулятора или устройства. Он официально не поддерживается Google, но Google осознает, что он широко используется и пытается не просто нарушить его.