Единичный тест на функцию расширения Kotlin на Android SDK Classes

Функция расширения Котлина велика. Но как я могу выполнить модульный тест? Особенно те, что относятся к Android SDK, предоставляют класс (например, Context, Dialog).

Я приведу два примера ниже, и если кто-то может поделиться тем, как я могу их протестировать, или если мне нужно написать их по-другому, если я действительно хочу их протестировать.

fun Context.getColorById(colorId: Int): Int { if (Build.VERSION.SDK_INT >= 23) return ContextCompat.getColor(this, colorId) else return resources.getColor(colorId) } 

а также

 fun Dialog.setupErrorDialog(body : String, onOkFunc: () -> Unit = {}): Dialog { window.requestFeature(Window.FEATURE_NO_TITLE) this.setContentView(R.layout.dialog_error_layout) (findViewById(R.id.txt_body) as TextView).text = body (findViewById(R.id.txt_header) as TextView).text = context.getString(R.string.dialog_title_error) (findViewById(R.id.txt_okay)).setOnClickListener{ onOkFunc() dismiss() } return this } 

Любое предложение поможет. Благодаря!

То, как я тестирую функции расширения в классах Android на данный момент, – это насмехаться над классом Android. Я знаю, это не оптимальное решение, поскольку он издевается над тестируемым классом и требует определенных знаний о том, как работает функция (как это всегда бывает, когда насмехается), но поскольку функции расширения внутренне реализованы как статические функции, я предполагаю, что это приемлемо пока кто-то не придумает что-то лучше.

В качестве примера рассмотрим класс JsonArray . Мы определили функцию расширения для получения индекса последнего элемента:

 fun JSONArray.lastIndex() = length() - 1 

Соответствующий тест (с использованием тестовой среды Spek и mockito-kotlin ) выглядит следующим образом.

 @RunWith(JUnitPlatform::class) object JsonExtensionTestSpec : Spek({ given("a JSON array with three entries") { val jsonArray = mock<JSONArray> { on { length() } doReturn 3 } on("getting the index of the last item") { val lastIndex = jsonArray.lastIndex() it("should be 2") { lastIndex shouldBe 2 } } } given("a JSON array with no entries") { val jsonArray = mock<JSONArray>({ on { length() } doReturn 0 }) on("getting the index of the last item") { val lastIndex = jsonArray.lastIndex() it("should be -1") { lastIndex shouldBe -1 } } } }) 

Трудность с вашими функциями состоит в том, что они также используют классы Android внутри. К сожалению, у меня сейчас нет решения.

Intereting Posts
Статические переменные в Котлине по-прежнему являются частью экземпляров объектов Почему не используется Intellij Idea Console для пользовательского ввода Посылка: неспособность маршалировать стоимость Идиоматический способ чтения двоичного файла с Kotlin? NullPointerException для android.support.v4.app.NotificationCompatBase $ Action.getIcon () Неожиданная разница типов между эквивалентным Java и кодом потока Kotlin Использование Kotlin в библиотеке Android, распространяемой как AAR Как мне наследовать документацию KDoc? Kotlin – lateinit TestRestTemplate не инициализирует интеграционные тесты Создание комментариев метода / класса Kotlin Android Studio сообщает «Не удалось определить активность запуска: активность по умолчанию не найдена» при построении проектов Kotlin Использование @JvmOverloads Kotlin с шаблоном Fragment.newInstance () Android Вложенные многозадачи в Котлине Как сохранить объект класса данных в общих предпочтениях с помощью Kotlin? Аннотации Android с Kotlin