代码之家  ›  专栏  ›  技术社区  ›  Jan B. HDR

将Java Mockito测试转换为Kotlin

  •  3
  • Jan B. HDR  · 技术社区  · 6 年前

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

    无法推断此参数的类型。请明确指定。

    我试过像这样调整lambda

        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\u correctParkIdMappingGeneration$1不能强制转换为org.mockito.stubbing.Answer

    org.mockito.exceptions.misusing.UnfinishedStubbingException: -&燃气轮机;在com.foobar.ParkIdGenerationServiceTest.testSomething(帕基德)enerationServiceTest.kt:92)

    最初的目的是修改传递给 save repository 把它还给我。有什么办法吗?

    1 回复  |  直到 6 年前
        1
  •  4
  •   Jan B. HDR    6 年前

    移动到 Answer<ParkIdMapping> getArgument

    Mockito.any() 在它的验证函数中返回null,由于Kotlin null安全特性,mock抛出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 interop的未来阅读: https://medium.com/@elye.project/befriending-kotlin-and-mockito-1c2e7b0ef791