Как узнать, работает ли мое приложение с Robolectric?

У меня есть приложение для Android, которое использует ORMLite/SQLite, и я использую Robolectric в сочетании с JUnit 4, чтобы позволить мне запускать модульные тесты в Android Studio и на сервере сборки Jenkins.

Обычно я настраивал тестовые данные в своих тестах, в настройках, а затем запускал свои тестовые сценарии, но когда я пытался это сделать, я начал получать проблемы и исключения, которые, как представляется, были связаны с заблокированными файлами или чем-то еще что, по-видимому, проблема, которая у других была... поэтому то, что я сделал до сих пор, использует метод create database в моем помощнике базы данных для создания некоторых фиктивных данных, которые, как ожидается, будут испытывать тесты.

Проблема заключается в том, что моему приложению теперь нужно подключиться к реальной базе данных, и я не могу установить ее фиктивные данные при ее запуске.

Если есть способ в моем вспомогательном классе базы данных определить, выполняется ли код на устройстве или внутри Robolectric?

Ответ 1

Это то, что хорошо работает для меня на Robolectric 3.

public static boolean isRoboUnitTest() {
    return "robolectric".equals(Build.FINGERPRINT);
}

Ответ 2

Для начала я скажу, что вы не должны вводить код для инициализации фиктивных/тестовых данных в нормальном исходном коде, и в общем случае вам не нужно знать из основного приложения, если вы находитесь в robo run или нет.

Теперь перейдем к отказу от ответственности и на самом деле ответим на ваш вопрос... Один из способов, которым вы могли бы это сделать, - иметь метод в вашем классе приложения, подобном этому

public boolean isRoboTestRun() {
    return false;
}

Затем создайте "TestApplication" в тестовом пакете, который расширяет ваше обычное приложение и переопределяет этот метод до return true. Это взломанно, но это потому, что на самом деле это не предназначено для работы именно так.

Ответ 3

В какой-то момент вам нужно выполнить init OrmLiteSqliteOpenHelper с помощью Context.

Предположим, что вы делаете это в своем классе приложений в onCreate. Поэтому просто создайте Test<your application class name> в своих источниках тестов и переопределите onCreate с пустой реализацией.

Robolectric найдет этот класс и будет использоваться во время тестов. Подробнее здесь.