Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Java Mockito测试转换为Kotlin_Java_Kotlin_Mockito - Fatal编程技术网

将Java Mockito测试转换为Kotlin

将Java Mockito测试转换为Kotlin,java,kotlin,mockito,Java,Kotlin,Mockito,我在将以下工作Javatest转换为Kotlin @Test public void testSomething() { Mockito.when(parkIdMappingRepository.save(Mockito.any(ParkIdMapping.class))).thenAnswer( (Answer<ParkIdMapping>) invocation -> { ParkIdMapping mapping = in

我在将以下工作
Java
test转换为
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());
@测试
公共空间{
Mockito.when(parkIdMappingRepository.save(Mockito.any(ParkIdMapping.class))。然后回答(
(答)调用->{
ParkIdMapping=invocation.getArgument(0);
映射。setId(100L);
回归映射;
}
);
ParkIdMapping mapping=parkIdMappingRepository.save(新的ParkIdMapping(“123”);
assertEquals(新的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)
}
@测试
公共娱乐测试\u correctParkIdMappingGeneration(){
Mockito.`when`(parkIdMappingRepository.save(Mockito.any(ParkIdMapping::class.java))。然后回答(
{invocation->//编译器错误
val mapping=invocation.getArgument(0)
mapping.id=100L
映射
}作为回答
)
val mapping=parkIdMappingRepository.save(ParkIdMapping(“123”))
assertEquals(100L,mapping.id)
}
但是,带有lambda参数“invocation”的行会导致编译器错误:

无法推断此参数的类型。请显式指定它

我试着像这样调整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>
    )
Mockito.`when`(parkIdMappingRepository.save(Mockito.any(ParkIdMapping::class.java))。然后回答(
{调用:调用锁->
val mapping=invocation.getArgument(0)作为ParkIdMapping
mapping.id=100L
映射
}作为回答
)
导致

java.lang.ClassCastException:com.foobar.parkidGenerationsServiceTest$test\u correctParkIdMappingGeneration$1无法强制转换为org.mockito.stubing.Answer

org.mockito.exceptions.misusing.unfinishedstubingexception: 此处检测到未完成的存根: ->在com.foobar.ParkIdGenerationServiceTest.testSomething(ParkIdGenerationServiceTest.kt:92)


最初的目的是修改传递到
存储库
save
方法的实体并将其返回。您知道怎么做吗?

将unchecked cast移动到
Answer
getArgument
调用

此外,您还需要添加helper mock方法。
Mockito.any()
在其验证函数中返回null,并且由于Kotlin null安全特性,mock会抛出NPE

像这样:

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

fun <T> uninitialized(): T = null as T
fun any():T{
Mockito.any()
返回未初始化()
}
fun uninitialized():T=null作为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)
}
@测试
公共娱乐测试\u correctParkIdMappingGeneration(){
Mockito.`when`(parkIdMappingRepository.save(any())。然后回答(
{invocation->//编译器错误
val mapping=invocation.getArgument(0)
mapping.id=100L
映射
}
)
val mapping=parkIdMappingRepository.save(ParkIdMapping(“123”))
assertEquals(100L,mapping.id)
}

关于Kotlin和Mockito interop的后续阅读:

感谢您的快速响应。现在我在
时(测试正文的第一行)出现了一个编译器错误,“类型推断失败。没有足够的信息在*fun when(methodCall:T!):ongoingstubing中推断参数T!请明确指定”我遗漏了什么吗?试着明确指定
的参数when
Mockito.`when`()
就像一个符咒。我可以随时更新您的代码片段并将您的答案标记为已解决。非常感谢。