¿Cómo probar una class con un oyente anónimo que se establece dentro de una function?

Solo estoy entrando en testings unitarias en Android y encontré algunas dificultades cuando intenté probar la function bindTo() de esta class.

 class DataFlow<T> (produce: DataFlowProducer<T>): BaseDataFlow<T>(produce) { var updateOnAttach: Boolean = true fun bindTo(viewKontroller: ViewKontroller, updateImmediately: Boolean, updateUi: (data: T) -> Unit) { this.updateUi = updateUi if (updateImmediately) flow() viewKontroller.addLifecycleListener(object : Controller.LifecycleListener() { override fun postAttach(controller: Controller, view: View) { if (updateOnAttach) flow() } override fun preDestroyView(controller: Controller, view: View) { viewKontroller.removeLifecycleListener(this) this@DataFlow.updateUi = null } }) } } 

Si me burlo de mi testing de ViewKontroller aún se bloquea con NPE en la línea viewKontroller.addLifecycleListener .

Entonces, ¿qué estoy haciendo mal?

Lo que quiere verificar en la testing probablemente sea al less esto:

  1. LifecycleListener agregado a ViewKontroller
  2. Cuando onPostAttach es llamado por ViewKontroller ocurre algo
  3. Cuando preDestroyView es llamado por ViewKontroller ocurre algo más

Por lo tanto, el doble de testing de ViewKontroller que pasa al constructor necesita "decirle" si un oyente fue registrado, y también para delegar llamadas de método a ese oyente.

En tales casos, cuando el object doble de testing necesita tener alguna funcionalidad real, es mejor implementar un falso que usar un simulacro.

En su caso, simplemente implemente FakeViewKontroller que extienda ViewKontroller y lo pase al sistema bajo testing en lugar de simularlo.

En esa class puede exponer methods adicionales que le permitirán asegurarse de que se agregó LifecycleListener y llamar a methods en ese oyente en casos de testing.

  • Kotlin Unit Test siempre pasa cuando se ejecuta desde la IU de Android Studio
  • Corutinas de testing unitaria en el hilo de UI
  • La cobertura de código de estudio de Android no muestra ninguna class de Kotlin
  • ¿Cómo no emitir datos de Flowable para testings unitarias?
  • Kotlin coroutines usa produce y mockito para burlarse del trabajo de producción
  • Calculadora simple, testing unitaria usando KOTLIN con Spek (código de salida -1)
  • El resultado es el mismo, pero el caso de testing no pasa en la testing unitaria
  • cómo acceder a las properties internas desde el código de testing java
  • Kotlin coroutines unit testing usando mockito
  • Fallar las testings de la unidad kotlin después del plugin de gradle 3.0
  • Solo la primera testing pasa con TestScheduler cuando se ejecutan varias testings (Kotlin)