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.

  • La cobertura de código de estudio de Android no muestra ninguna class de Kotlin
  • TestScheduler no funciona (Kotlin + RxJava2 + mockito)
  • Calculadora simple, testing unitaria usando KOTLIN con Spek (código de salida -1)
  • Unidad de testing Room y LiveData
  • Referencia no resuelta: DaggerTestComponent (Kotlin with Dagger for Test)
  • ¿Proporcionando object burlado a otro constructor de object falso?
  • Kotlin coroutines unit testing usando mockito
  • Ejecute testings de Kotlin Koans desde Android Studio
  • ¿Cómo no emitir datos de Flowable para testings unitarias?
  • cómo acceder a las properties internas desde el código de testing java
  • Solo la primera testing pasa con TestScheduler cuando se ejecutan varias testings (Kotlin)