JavaのMockitoテストはKotlinへの変換します

マット:

私は、次の作業の変換の問題持っている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());

Kotlinへの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:未完のスタブは、ここで検出された: - >(ParkIdGenerationServiceTest.kt:92)com.foobar.ParkIdGenerationServiceTest.testSomethingで

本来の目的は、に渡されたエンティティ変更することであるsave方法をrepository、それを返します。何をすべきか任意のアイデア?

モル:

未チェックのキャストを移動Answer<ParkIdMapping>するgetArgumentコール。

また、あなたはヘルパーモックメソッドを追加する必要があります。Mockito.any()リターンはそれの検証機能でヌルとモックがあるためKotlinヌル・安全機能の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)
}

KotlinとMockito相互運用上の将来の読み:https://medium.com/@elye.project/befriending-kotlin-and-mockito-1c2e7b0ef791

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=189336&siteId=1