¿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.

  • Fallar las testings de la unidad kotlin después del plugin de gradle 3.0
  • El resultado es el mismo, pero el caso de testing no pasa en la testing unitaria
  • TestScheduler no funciona (Kotlin + RxJava2 + mockito)
  • Referencia no resuelta: DaggerTestComponent (Kotlin with Dagger for Test)
  • Comparta el código entre la testing unitaria y las testings de instrumentación cuando use kotlin
  • Prueba unitaria de la function de extensión de Kotlin en las classs de Android SDK
  • Solo la primera testing pasa con TestScheduler cuando se ejecutan varias testings (Kotlin)
  • cómo acceder a las properties internas desde el código de testing java
  • Kotlin coroutines unit testing usando mockito
  • ¿Proporcionando object burlado a otro constructor de object falso?
  • Kotlin coroutines usa produce y mockito para burlarse del trabajo de producción