Ответ 1
Это то, что хорошо работает для меня на Robolectric 3.
public static boolean isRoboUnitTest() {
return "robolectric".equals(Build.FINGERPRINT);
}
У меня есть приложение для Android, которое использует ORMLite/SQLite, и я использую Robolectric в сочетании с JUnit 4, чтобы позволить мне запускать модульные тесты в Android Studio и на сервере сборки Jenkins.
Обычно я настраивал тестовые данные в своих тестах, в настройках, а затем запускал свои тестовые сценарии, но когда я пытался это сделать, я начал получать проблемы и исключения, которые, как представляется, были связаны с заблокированными файлами или чем-то еще что, по-видимому, проблема, которая у других была... поэтому то, что я сделал до сих пор, использует метод create database в моем помощнике базы данных для создания некоторых фиктивных данных, которые, как ожидается, будут испытывать тесты.
Проблема заключается в том, что моему приложению теперь нужно подключиться к реальной базе данных, и я не могу установить ее фиктивные данные при ее запуске.
Если есть способ в моем вспомогательном классе базы данных определить, выполняется ли код на устройстве или внутри Robolectric?
Это то, что хорошо работает для меня на Robolectric 3.
public static boolean isRoboUnitTest() {
return "robolectric".equals(Build.FINGERPRINT);
}
Для начала я скажу, что вы не должны вводить код для инициализации фиктивных/тестовых данных в нормальном исходном коде, и в общем случае вам не нужно знать из основного приложения, если вы находитесь в robo run или нет.
Теперь перейдем к отказу от ответственности и на самом деле ответим на ваш вопрос... Один из способов, которым вы могли бы это сделать, - иметь метод в вашем классе приложения, подобном этому
public boolean isRoboTestRun() {
return false;
}
Затем создайте "TestApplication" в тестовом пакете, который расширяет ваше обычное приложение и переопределяет этот метод до return true
.
Это взломанно, но это потому, что на самом деле это не предназначено для работы именно так.
В какой-то момент вам нужно выполнить init OrmLiteSqliteOpenHelper
с помощью Context
.
Предположим, что вы делаете это в своем классе приложений в onCreate
. Поэтому просто создайте Test<your application class name>
в своих источниках тестов и переопределите onCreate
с пустой реализацией.
Robolectric
найдет этот класс и будет использоваться во время тестов. Подробнее здесь.