android unit-testing kotlin kotlin-android-extensions kotlin-extension

Prueba de unidad en la función de extensión de Kotlin en clases de SDK de Android



unit-testing kotlin-android-extensions (1)

La forma en que estoy probando las funciones de extensión en las clases de Android en este momento es burlándose de la clase de Android. Lo sé, esta no es una solución óptima ya que se burla de la clase bajo prueba y requiere cierto conocimiento sobre cómo funciona la función (como siempre ocurre cuando se burlan), pero como las funciones de extensión se implementan internamente como funciones estáticas, creo que es aceptable Hasta que a alguien se le ocurra algo mejor.

Como ejemplo consideremos la clase JsonArray . Hemos definido una función de extensión para recibir el índice del último elemento:

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

La prueba correspondiente (utilizando el marco de prueba Spek y mockito-kotlin ) se ve así.

@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 } } } })

La dificultad con sus funciones es que también usan clases de Android internamente. Desafortunadamente no tengo una solución para esto ahora.

La función de extensión de Kotlin es genial. Pero, ¿cómo podría realizar la prueba de unidad en ellos? Especialmente aquellos que son de clase provista por el SDK de Android (por ejemplo, contexto, diálogo).

Proporciono dos ejemplos a continuación, y si alguien pudiera compartir cómo podría hacerles una prueba de unidad, o si necesito escribirlos de manera diferente, si realmente quiero hacer una prueba de unidad.

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

y

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 }

Cualquier sugerencia ayudaría. ¡Gracias!