Convertir la prueba de Java Mockito a Kotlin

Matt:

Tengo un problema convirtiendo el siguiente trabajo Javade 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 savemétodo de la repositoryy devolverlo. ¿Alguna idea de qué hacer?

mol:

Mover fundido sin marcar para Answer<ParkIdMapping>que getArgumentla 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

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=189339&siteId=1
Recomendado
Clasificación