Тесты JUnit запускаются на локальной машине, на которой нет всего исходного кода Android, но только классы-заглушки (описано here). Эти классы-заглушки позволяют вам скомпилировать Android-приложение против них (потому что их API идентичен реальной платформе Android), но они не содержат никакой логики, чтобы сделать их «легкими».
По умолчанию при попытке вызвать любой из методов заглушки вы получаете исключение. Что-то вроде этого:
public Bundle() {
throw new RuntimeException("Stub!");
}
этот «провал быстро» подход был использован для того, чтобы предотвратить разработчик от случайного запуска своего кода против этих классов заглушек, а затем интересно, почему он не работает.
Однако это поведение можно изменить с помощью этой конфигурации в build.gradle
:
android {
...
testOptions {
unitTests.returnDefaultValues = true
}
}
это делает методы заглушки возвращают значение по умолчанию, вместо того, чтобы бросать исключения.
У вас, вероятно, включена эта функция, поэтому при запуске тестов JUnit вы не получите исключение, но метод Bundle#getString()
просто возвращает значение по умолчанию (которое равно null
).
Если вы хотите проверить код, который имеет Android рамочной зависимости, вы должны сделать что-либо из:
- Mock этих зависимостей (например, Mockito)
- испытаний Run с Robolectric
- Run инструментальных тестов на Android устройство
В любом случае unitTests.returnDefaultValues = true
ОПИСАНИЕ ОЧЕНЬ ОПАСНАЯ, поскольку она делает ваши тесты ненадежными: некоторые тесты могут проходить, поскольку по умолчанию значение было возвращено методом stub, но функциональность не работает на реальном устройстве. Выключи.
Какую среду вы используете? Инструментальный тест, Robolectric, JUnit, другой? – Vasiliy
Привет vasiliy junit test –