Короткий ответ - это то, что @CommonsWare и @TheWanderer упомянули в комментариях: мой тестовый класс находился в каталоге test/
, поэтому он использовал фиктивную реализацию Intent
вместо реальной.
Когда я перемещаю свой тест в каталог androidTest/
, все работает как положено. Наблюдаемое поведение не имеет ничего общего с Котлиным.
Некоторая дополнительная информация о том, почему это так запутанно ...
Во-первых, я ошибся, когда написал следующее:
val data = Intent()
data.putExtra("key", "value")
// data is non-null and contains my key/value
Переменная data
была ненулевой, но на самом деле она не содержала мою пару ключ / значение. В фиктивной реализации Intent
, которую я использовал, отбрасывался putExtra()
вызов.
Итак, почему мой тест прошел?
Один конкретный тест, на котором я решил углубиться, это проверка отрицательного случая (когда ключ, отличный от ожидаемого, присутствует в Intent
). Но я не передавал Намерение с неправильным ключом, я передавал Намерение без ключей вообще. В любом случае, ожидаемый ключ отсутствует, и метод возвращает false
.
Положительный случай (когда требуемый ключ на самом деле был передан putExtra()
) потерпел неудачу с AssertionError
. Жаль, что я не выбрал этот, чтобы исследовать.
Мой основной проект, по-видимому, отключил Intent.putExtra()
как запрет на использование опции returnDefaultValues = true
gradle. Когда я создаю новый проект и пытаюсь воспроизвести эту проблему, я получаю очень четкую ошибку:
java.lang.RuntimeException: Method putExtra in android.content.Intent not mocked. See http://g.co/androidstudio/not-mocked for details.
at android.content.Intent.putExtra(Intent.java)
at com.example.stackoverflow.IntentTest.test(IntentTest.kt:12)
К сожалению, с высмеянным putExtra()
я так и не получил это полезное сообщение.