unit test nhaarman kt1 unit-testing mocking mockito kotlin

unit testing - test - ¿Es posible usar Mockito con Kotlin sin abrir la clase?



com nhaarman mockito kotlin kt1 (3)

Como probablemente sepamos, por defecto la clase Kotlin una vez definida, es definitiva, a menos que se declare explícitamente open .

Esto publicaría un desafío cuando queremos simularlo usando Mockito. Necesitamos declararlo explícitamente como open . ¿Hay alguna manera de evitar declararlo como open mientras podemos simularlo para nuestras pruebas?


Hay tres formas en que soy consciente de cómo puedes burlarte de las clases de Kotlin:

  1. Usa interfaces en lugar de clases. En este caso, reemplaza todos los usos de una clase en particular con la interfaz correspondiente. Y en el código de prueba te burlas de la interfaz.

    interface Something { /* ... */ } class SomethingImpl : Something { /* ... */ } fun processSomething(something: Something) { /* ... */ } val something = mock(Something::class.java) processSomething(mock)

  2. Hacer clases abiertas, lo cual no es muy conveniente.

  3. Use PowerMock en lugar de Mockito. Usando su ClassLoader puedes hacer mucho más que con Mockito.

Prefiero el primer enfoque porque es una buena idea trabajar con interfaces en lugar de clases, incluso si no usa marcos de burla.


El complemento MockMaker no parece funcionar cuando se ejecutan pruebas de expreso. Por lo tanto, puedes usar el pugin abierto de Kotlin en su lugar.

Agregue el complemento en build.gradle:

buildscript { dependencies { classpath "org.jetbrains.kotlin:kotlin-allopen:$kotlin_version" } } apply plugin: "kotlin-allopen"

Especifique la anotación que hará que la clase se abra:

allOpen { annotation("com.my.MyMockable") }

Crea tu anotación que se puede usar para anotar clases:

@Target(AnnotationTarget.CLASS) annotation class MyMockable

Luego, para hacer que su clase y sus métodos públicos sean Mockable (abierto), anótelo con su anotación:

@MyMockable


Mockito2 ahora puede burlarse de las clases finales también.

Sin embargo, esta función es opcional , por lo que debe habilitarla manualmente.
Para hacerlo, debe definir un archivo /mockito-extensions/org.mockito.plugins.MockMaker contenga la línea mock-maker-inline

Ver por ej.
http://hadihariri.com/2016/10/04/Mocking-Kotlin-With-Mockito/ o https://github.com/mockito/mockito/wiki/What%27s-new-in-Mockito-2#unmockable
para una introducción rápida

en una nota lateral, esto actualmente no funciona para Android