Редактировать: см. Обновленный ответ в конце
Я нашел ответ на этот вопрос. Это не решает мою проблему, но, по крайней мере, объясняет , почему есть проблема.
Сначала я сделал ошибочное предположение, что JSONObject
(импортированный из пакета org.json
) был включен в состав JRE. Это не так - в проекте Android это находится в android.jar
(классический «дух» момент).
Это открытие немного повысило мою уверенность в себе. Эту проблему можно легко решить, добавив ссылку на android.jar
в моем проекте модульного тестирования - или, по крайней мере, так я подумала ненадолго. Это дало мне еще одну ошибку при запуске теста:
java.lang.RuntimeException: Stub!
at org.json.JSONObject.<init>(JSONObject.java:8)
...
По крайней мере, это дало мне кое-что еще для Google. Однако то, что я обнаружил, было не очень обнадеживающим (еще один классический "дух" момент) ...
Этот блог довольно хорошо описывает проблему: Почему Android не готов к TDD, и как я пытался в любом случае . Если вы не удосужились прочитать все это, краткое объяснение таково:
Проблема здесь в том, что
Android.jar поставляется с SDK
заглушен без реализации
код. Решение, которое кажется
Ожидается, что вы должны запустить свой
модульные тесты на эмуляторе или реале
телефон.
Продолжая заниматься поиском в этой области, я нашел несколько статей, блогов, а также вопросы здесь, посвященные этой проблеме. В конце я добавлю несколько ссылок для тех, кто может искать:
И еще много, если вы посмотрите вокруг.
Во многих из этих ссылок есть несколько предложений / решений / альтернативных подходов к модульному тестированию в Android, но я не стану пытаться дать хороший ответ, основанный на этом (так как очевидно слишком много, я все еще не знаю о разработке Android). Если у кого-нибудь есть хорошие советы, я буду рад услышать о них:)
UPDATE:
После еще нескольких экспериментов мне действительно удалось найти рабочее решение этой конкретной проблемы. Причина, по которой я не попробовал это в первую очередь, заключалась в том, что я думал, что где-то читал, что было бы проблематично включить «нормальные» библиотеки Java в мое приложение для Android. Я пробовал так много разных вещей, чтобы обойти мою проблему, поэтому я решил, что просто попробую и это - и это действительно сработало! Вот как это сделать:
- Я скачал исходный код "реального" пакета
org.json
здесь: http://www.json.org/java/index.html
- Затем я скомпилировал исходный код и собрал его в свой собственный json.jar
- Я добавил недавно созданный json.jar в путь сборки моего проекта (основной проект моего приложения для Android, а не тестовый проект)
Никаких изменений в моем коде, никаких изменений в моем тесте, только добавление этой библиотеки. И все работает, и мое приложение для Android, и мои юнит-тесты.
Я также тестировал пошаговое выполнение кода в режиме отладки, и при отладке приложения Android JSONObject
в моем JsonCourseParser
выбирается из Android SDK ( android.jar ), но при отладке мой модульный тест получен из моего json.jar . Не уверен, означает ли это, что json.jar не включается при сборке моего приложения или если среда выполнения разумно выбирает правильную библиотеку для использования. Также не уверен, может ли эта дополнительная библиотека повлиять на мое последнее приложение. Я думаю, только время покажет ...