Tengo un problema convirtiendo el siguiente trabajo Java
de prueba paraKotlin
@Test
public void testSomething() {
Mockito.when(parkIdMappingRepository.save(Mockito.any(ParkIdMapping.class))).thenAnswer(
(Answer<ParkIdMapping>) invocation -> {
ParkIdMapping mapping = invocation.getArgument(0);
mapping.setId(100L);
return mapping;
}
);
ParkIdMapping mapping = parkIdMappingRepository.save(new ParkIdMapping("123"));
assertEquals(new Long(100L), mapping.getId());
La conversión realizada por IntelliJ IDEA a Kotlin se traduce en:
@Test
public fun test_correctParkIdMappingGeneration() {
Mockito.`when`(parkIdMappingRepository.save(Mockito.any(ParkIdMapping::class.java))).thenAnswer(
{ invocation -> // compiler error
val mapping = invocation.getArgument(0)
mapping.id = 100L
mapping
} as Answer<ParkIdMapping>
)
val mapping = parkIdMappingRepository.save(ParkIdMapping("123"))
assertEquals(100L, mapping.id)
}
La línea con el parámetro lambda 'invocación', sin embargo, causa un error de compilación:
No se puede inferir un tipo de este parámetro. Por favor, especifique explícitamente.
He tratado de ajustar la lambda como esto
Mockito.`when`(parkIdMappingRepository.save(Mockito.any(ParkIdMapping::class.java))).thenAnswer(
{ invocation: InvocationOnMock ->
val mapping = invocation.getArgument(0) as ParkIdMapping
mapping.id = 100L
mapping
} as Answer<ParkIdMapping>
)
Resultando en
java.lang.ClassCastException: com.foobar.ParkIdGenerationServiceTest $ test_correctParkIdMappingGeneration $ 1 puede no ser echado a org.mockito.stubbing.Answer
org.mockito.exceptions.misusing.UnfinishedStubbingException: tropezar sin terminar detecta aquí: -> en com.foobar.ParkIdGenerationServiceTest.testSomething (ParkIdGenerationServiceTest.kt: 92)
La intención original es modificar la entidad que se pasa al save
método de la repository
y devolverlo. ¿Alguna idea de qué hacer?
Mover fundido sin marcar para Answer<ParkIdMapping>
que getArgument
la llamada.
Además, es necesario añadir ayudante método simulado. Mockito.any()
vuelve nulo en su función de verificación y la maqueta lanza NPE debido función Null-Kotlin seguridad.
Me gusta esto:
fun <T> any(): T {
Mockito.any<T>()
return uninitialized()
}
fun <T> uninitialized(): T = null as T
Y la prueba será:
@Test
public fun test_correctParkIdMappingGeneration() {
Mockito.`when`<ParkIdMapping>(parkIdMappingRepository.save(any())).thenAnswer(
{ invocation -> // compiler error
val mapping = invocation.getArgument<ParkIdMapping>(0)
mapping.id = 100L
mapping
}
)
val mapping = parkIdMappingRepository.save(ParkIdMapping("123"))
assertEquals(100L, mapping.id)
}
Futuro de la lectura en Kotlin y Mockito interoperabilidad: https://medium.com/@elye.project/befriending-kotlin-and-mockito-1c2e7b0ef791