Конвертировать тест Java Mockito в Kotlin - PullRequest
0 голосов
/ 20 сентября 2018

У меня проблема с преобразованием следующего рабочего Java теста в Kotlin

@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());

Преобразование, выполненное Intellij Idea в Kotlin, приводит к:

@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)
}

Однако строка с лямбда-параметром 'invocation' вызывает ошибку компилятора:

Невозможно определить тип для этого параметра.Пожалуйста, укажите это явно.

Я пытался настроить лямбду следующим образом

    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>
    )

, что привело к

java.lang.ClassCastException:com.foobar.ParkIdGenerationServiceTest $ test_correctParkIdMappingGeneration $ 1 не может быть приведен к org.mockito.stubbing.Answer

org.mockito.exceptions.misusing.UnfinishedStubbingException: незавершенная проверка подлинности обнаружена здесь: ->.(ParkIdGenerationServiceTest.kt: 92)

Первоначальное намерение состоит в том, чтобы изменить сущность, которая передается методу save метода repository, и вернуть его.Есть идеи что делать?

1 Ответ

0 голосов
/ 20 сентября 2018

Переместить непроверенный актерский состав к вызову Answer<ParkIdMapping> на getArgument.

Также вам нужно добавить вспомогательный метод макета.Mockito.any() возвращает ноль в своей функции проверки, и имитатор выбрасывает NPE из-за функции нулевой безопасности Kotlin.

Вот так:

fun <T> any(): T {
    Mockito.any<T>()
    return uninitialized()
}

fun <T> uninitialized(): T = null as T

И тест будет:

@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)
}

Будущее чтение о взаимодействии Kotlin и Mockito: https://medium.com/@elye.project/befriending-kotlin-and-mockito-1c2e7b0ef791

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...