Prueba unitaria de la function de extensión de Kotlin en las classs de Android SDK

La function de extensión Kotlin es genial. Pero, ¿cómo podría realizar la testing de unidad en ellos? Especialmente los que pertenecen a la class proporcionada por Android SDK (por ejemplo, Context, Diálogo).

Proporciono dos ejemplos a continuación, y si alguien pudiera compartir cómo podría probarlos en una unidad, o si tengo que escribirlos de otra manera si realmente quiero probarlos en una 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!

La forma en que estoy probando las funciones de extensión en las classs de Android en este momento es burlando la class de Android. Lo sé, esta no es una solución óptima ya que se burla de la class bajo testing y requiere cierto conocimiento sobre cómo funciona la function (como siempre ocurre cuando se burla), pero como las funciones de extensión se implementan internamente como funciones estáticas, supongo que es aceptable hasta que a alguien se le ocurra algo mejor.

Como ejemplo, considere la class JsonArray . Hemos definido una function de extensión para recibir el índice del último elemento:

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

La testing de acuerdo (usando el marco de testing de 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 classs de Android internamente. Lamentablemente, no tengo una solución para esto ahora mismo.

  • cómo acceder a las properties internas desde el código de testing java
  • TestScheduler no funciona (Kotlin + RxJava2 + mockito)
  • Kotlin Unit Test siempre pasa cuando se ejecuta desde la IU de Android Studio
  • El resultado es el mismo, pero el caso de testing no pasa en la testing unitaria
  • No se pueden usar los nombres de método retrocedidos de Kotlin en androidTest - exception de descriptor incorrecto
  • La testing Running Spek muestra el error "Suite de testing vacía"
  • ¿Cómo probar el método del presentador en base a un valor devuelto por Observable?
  • ¿Cómo probar una class con un oyente anónimo que se establece dentro de una function?
  • Comparta el código entre la testing unitaria y las testings de instrumentación cuando use kotlin
  • ¿Cómo un código de testing unitaria envuelto en `runOnUiThread`?
  • Corutinas de testing unitaria en el hilo de UI