코 틀린 자바 Mockito 테스트를 변환

매트 :

나는 다음과 같은 작업을 변환하는 문제가있어 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 아이디어에 의해 수행 변환은 결과 :

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

람다 파라미터 '호출'으로 라인 그러나 컴파일러 에러 발생 :

이 매개 변수의 유형을 추론 할 수 없습니다. 명시 적으로 지정하십시오.

이 같은 람다를 조정하기 위해 노력했습니다

    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는 : 미완성 스터 빙 여기 검출 -> com.foobar.ParkIdGenerationServiceTest.testSomething (ParkIdGenerationServiceTest.kt 92)에서

원래 의도는 전달되는 개체 수정하는 것입니다 save의 방법을 repository하고 돌아갑니다. 무엇을해야 하는지를 어떤 아이디어?

몰 :

에 체크되지 않은 캐스트를 이동 Answer<ParkIdMapping>getArgument전화를 겁니다.

또한, 도우미 모의 방법을 추가해야합니다. Mockito.any()반환은 그것의 검증 기능에 null에 모의 때문에 코 틀린 널 안전 기능의 NPE가 발생합니다.

이 같이 :

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

코 틀린 및 Mockito 상호 운용성에 대한 미래 읽기 : https://medium.com/@elye.project/befriending-kotlin-and-mockito-1c2e7b0ef791

추천

출처http://43.154.161.224:23101/article/api/json?id=189334&siteId=1