Estoy usando Kotlin 1.6.10, Mockito 4.0.0 y Java 8 y tengo una interfaz Java definida así:
public interface MyInterface { <D, T extends MyObject<T, D>> T doThings(T myObject); } Se usa una implementación de esta interfaz en una aplicación Kotlin y tenemos una prueba unitaria en la que queremos asegurarnos de que el método doThings nunca se llame usando Mockito. En Java, simplemente haría esto:
verify(myInterfaceInstance, never()).doThings(any());Pero si hago esto en Kotlin obtengo un error de tiempo de compilación:
verify(myInterfaceInstance, never()).doThings(any())No hay suficiente información para inferir la variable de tipo D
Entiendo por qué este es el caso, pero no puedo hacer que funcione. En este caso particular, realmente no me importan los tipos genéricos, solo quiero asegurarme de que doThings nunca se llame. He probado muchas cosas diferentes, por ejemplo:
verify(myInterfaceInstance, never()).doThings<Any, MyObject<*, Any>>(any())que falla con:
Type argument is not within its bounds. Expected: MyObject<MyObject<*, Any>!, TypeVariable(D)!>! Found: MyObject<*, Any!>!y también he probado:
verify(myInterfaceInstance, never()).doThings<Any, MyObject<*, *>>(any())y varias otras permutaciones que parecen fallar con aproximadamente el mismo mensaje de error.
Entonces mi pregunta es, ¿cómo puedo hacer el equivalente de verify(myInterfaceInstance, never()).doThings(any()); en kotlin?
Esta no es una respuesta de Mockito, pero ¿te ayudaría Library Mockk? MockK está diseñado específicamente para Kotlin, por lo que podría tener mejores soportes para el manejo de genéricos.
La verificación se vería así:
verify(exactly = 0) { yourClass.doThings(any()) };https://notwoods.github.io/mockk-guidebook/docs/mocking/verify/
https://mockk.io/#verification-atleast-atmost-or-exactly-times
Esto compila bien, pero emite un par de advertencias, puede suprimirlas mediante una anotación respetuosa:
@Suppress("TYPE_MISMATCH_WARNING", "UPPER_BOUND_VIOLATED_WARNING") verify(myInterfaceInstance, never()).doThings<Any, MyObject<*, *>?>(any<MyObject<*, *>>())