Unit test в функции расширения Kotlin для Android SDK Classes

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

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

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
}

Любое предложение поможет. Спасибо!

Ответы

Ответ 1

То, как я тестирую функции расширения в классах 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 внутри. К сожалению, у меня сейчас нет решения.